我在 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 作为弹出窗口。 当我单步执行时,一切都进展顺利,除了我在屏幕上看不到任何内容。 任何帮助将不胜感激。
最佳答案
您的问题远非唯一……事实上,ToolTip
和 Popup
没有出现在屏幕截图中,这一事实已有详细记录。正如您所建议的,一般解决方案是简单地创建一个假装的 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>
为了使其更有用,我会为 TextBlock.Text
属性添加一个 Binding
,并为 Visibility
属性添加另一个,因此您还可以控制它何时出现和消失。
关于c# - WPF 自定义弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25318376/