c# - WPF 自定义弹出窗口

标签 c# wpf popup contentcontrol

我在 WPF 弹出窗口方面遇到了一个独特的问题。

在我的项目中,我需要获取全屏WPF应用程序的位图并将其发送出去。 为此,我在主 Canvas 上使用 RenderTargetBitmap。一切都很好,直到我开始使用菜单和组合框。它们都使用 Popup 来显示子菜单项。因此,根据我的阅读,弹出窗口是作为一个单独的窗口实现的,它不是主窗口的子窗口。因此渲染位图将无法获取它的位图。

所以我的解决方案是实现自定义弹出窗口并更改 MenuItem 的控件模板。

在我的自定义弹出窗口中,我执行此操作的 IsOpenChanged 事件

        private void PopupPanel_IsOpenChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if ((bool)e.NewValue)
            {
                ContentControl childControl = new ContentControl();
                childControl.Content = this.Content;

                Canvas rootCanvas = FindAncester<Canvas>(this);
                rootCanvas.Children.Add(childControl);

                childControl.Focus();

                Child = childControl;
            }
            else
            {
                if (Child != null)
                {
                    Canvas rootCanvas = FindAncester<Canvas>(this);
                    rootCanvas.Children.Remove(Child);

                    Child = null;
                 }
            }
        }

这个想法是在我的主 Canvas 顶部显示一个子 ContentControl 作为弹出窗口。 当我单步执行时,一切都进展顺利,除了我在屏幕上看不到任何内容。 任何帮助将不胜感激。

最佳答案

您的问题远非唯一……事实上,ToolTipPopup 没有出现在屏幕截图中,这一事实已有详细记录。正如您所建议的,一般解决方案是简单地创建一个假装的 Popup 控件。现在,我无法告诉您示例有什么问题,但我可以简单地为您提供一些 XAML,它将显示一个假装的 Popup 控件。试试这个:

<Grid>
    <!-- Declare normal view content here -->
    <Border CornerRadius="5" Background="White" BorderBrush="LightGray" 
        BorderThickness="1" Width="200" Height="100" Panel.ZIndex="10">
        <Border.Effect>
            <DropShadowEffect BlurRadius="10" Direction="270" ShadowDepth="7" 
                Opacity="0.5" />
        </Border.Effect>
        <TextBlock Text="I'm a fake Popup control" HorizontalAlignment="Center" 
            VerticalAlignment="Center" />
    </Border>
</Grid>

enter image description here

为了使其更有用,我会为 TextBlock.Text 属性添加一个 Binding,并为 Visibility 属性添加另一个,因此您还可以控制它何时出现和消失。

关于c# - WPF 自定义弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25318376/

相关文章:

c# - NSubstitute - 请对所有相同类型的参数使用规范。 TeamCity 上的问题

c# - 绑定(bind)数据源正在改变我的专栏

javascript - 使用链接创建 Facebook 对话框弹出窗口

javascript - 警报框中的顶行 - Javascript

c# - 从 Angular 4 SPA 请求 Web API 时范围声明为空

c# - 为什么 Enumerable.Single() 迭代所有元素,即使已经找到多个元素?

wpf - 激活 WPF 窗口而不会失去对以前的应用程序/窗口的关注

c# - WPF 组合框通配符子字符串搜索

wpf - 仅在 WPF 中的 ShowDialog() 之后设置 DialogResult

JavaScript 表单错误状态不会停留在同一页面上