通常,当您打开模态对话框并尝试单击它的父窗口时,模态对话框的标题栏会闪烁。在WPF中创建自定义,无边框,无边框的窗口时,您将失去所有这些功能,并且必须自己重建它。我看起来又高又低,因为我的生活无法弄清楚如何让我的模态窗口闪烁。虽然它仍然会发出哔哔声......
我想我将不得不在WndProc中观察一些我必须处理的事件,但我无法弄清楚哪个事件或如何做到这一点。我已经尝试观看窗口更改和窗口更改事件以及WM_ACTIVATE事件无济于事。我确定我只是错过了一些简单的东西,但我会很感激你的帮助。谢谢!
答案 0 :(得分:5)
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
var retVal = IntPtr.Zero;
switch (msg)
{
case UnsafeNativeConstants.WM_NCACTIVATE:
retVal = UnsafeNativeMethods.DefWindowProc(hwnd, UnsafeNativeConstants.WM_NCACTIVATE, new IntPtr(1), new IntPtr(-1));
AssociatedObject.UpdateTitlebar((int)wParam == 1 ? true : false);
handled = true;
break;
}
return retVal;
}
WndProc我已经连接到我的窗口附加的自定义行为。它在我的窗口上调用一个内部方法,它将适当地更新标题栏的颜色。
感谢@Hans Passant指出我正确的方向。
答案 1 :(得分:0)
如果您没有找到您正在寻找的内容,则有一种解决方法,即根本不使用模态窗口。
以下是如何做到的:
创建另一个名为MessageBoxUC的用户控件,并将消息框的内容放入其中
<UserControl x:Name="root" Visibility="{Binding ElementName=root, Path=IsOpen}">
<Grid Background="#4FFF"/>
<Border HorizontalAlignment="Center" VerticalAlignment="Center"
x:Name="border" Background="White"/>
<Grid.Triggers>
<EventTrigger RoutedEvent="MouseDown">
<BeginStoryboard>
<Storyboard Duration="0:0:1">
<ColorAnimation
Storyboard.TargetName="border"
Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"
To="Black" Duration="0:0:.2" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
</Grid>
</UserControl>
在MessageBoxUC中添加一个名为IsOpen的布尔依赖项属性(默认值= false)
按如下方式编写主窗口的xaml代码:
<Window xmlns:local="clr-namespace:MyWpfApplication">
<Grid>
<local:MainContentsUC/>
<local:MessageBoxUC/>
</Grid>
</Window>
这样,当MessageBoxUC打开时,它将阻止点击MainContentsUC。当你点击后面的区域(颜色设置为#4FFF)时,触发器会运行故事板并闪烁。
如果你有几个窗口,你可以实现不同的控制模板,并使用模板选择器在它们之间进行选择。所以不是<local:MainContentsUC/>
而是
<ContentPresenter ContentTemplateSelector="{StaticResource mySelector}"/>