C# WPF:如何制作自定义模式对话框flash?
通常,当您打开一个模态对话框并尝试单击它的父窗口时,模态对话框的标题栏会闪烁。在WPF中创建自定义、无边界、无铬的窗口时,您将失去所有功能,必须自己重新构建。我一直在四处张望,一辈子都不知道如何让模态窗口闪烁。虽然它仍然发出嘟嘟声C# WPF:如何制作自定义模式对话框flash?,c#,wpf,window,custom-controls,wndproc,C#,Wpf,Window,Custom Controls,Wndproc,通常,当您打开一个模态对话框并尝试单击它的父窗口时,模态对话框的标题栏会闪烁。在WPF中创建自定义、无边界、无铬的窗口时,您将失去所有功能,必须自己重新构建。我一直在四处张望,一辈子都不知道如何让模态窗口闪烁。虽然它仍然发出嘟嘟声 我想我将不得不关注WndProc中我必须处理的一些事件,但我不知道是哪个事件或如何处理。我试过观看窗口更改和窗口更改事件以及WM_激活事件,但都没有效果。我肯定我只是错过了一些简单的东西,但我会很感激在这方面的任何帮助。谢谢 如果您没有准确地找到您要查找的内容,那么有
我想我将不得不关注WndProc中我必须处理的一些事件,但我不知道是哪个事件或如何处理。我试过观看窗口更改和窗口更改事件以及WM_激活事件,但都没有效果。我肯定我只是错过了一些简单的东西,但我会很感激在这方面的任何帮助。谢谢 如果您没有准确地找到您要查找的内容,那么有一种解决方法,即根本不使用模式窗口 以下是您如何做到这一点:
<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>
<Window xmlns:local="clr-namespace:MyWpfApplication">
<Grid>
<local:MainContentsUC/>
<local:MessageBoxUC/>
</Grid>
</Window>
如果您没有准确地找到要查找的内容,有一种解决方法,即根本不使用模式窗口
以下是您如何做到这一点:
<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>
<Window xmlns:local="clr-namespace:MyWpfApplication">
<Grid>
<local:MainContentsUC/>
<local:MessageBoxUC/>
</Grid>
</Window>
我在附加到我的窗口的自定义行为中连接的WndProc。它在我的窗口上调用一个内部方法,该方法将适当地更新标题栏的颜色
感谢@Hans Passant为我指明了正确的方向
我在附加到我的窗口的自定义行为中连接的WndProc。它在我的窗口上调用一个内部方法,该方法将适当地更新标题栏的颜色
感谢@Hans Passant为我指明了正确的方向。这是WM\u NCACTIVATE消息。Spy++实用程序可以告诉你这些事情。我使用了Spy++,但从我可以告诉你的情况来看,无论是模式窗口失焦还是非模式窗口,WM_NCACTIVATE都会发送相同的消息。这似乎没有多大帮助。它还告诉我窗口正在被激活,我不知道如何从中判断,我需要刷新标题栏,而不仅仅是绘制一个激活的标题栏。你能说得更具体一点吗?关键是它会多次发送信息。这样就让它闪光了。我明白了。。。显然,仅仅因为发送了停用消息并不意味着窗口的IsActive属性实际上发生了更改。这不是停用消息,而是WM_ACTIVATE。“NC”消息是“窗口框架的外观”消息。“NC”==非客户端。它是WM\U NCACTIVE消息。Spy++实用程序可以告诉你这些事情。我使用了Spy++,但从我可以告诉你的情况来看,无论是模式窗口失焦还是非模式窗口,WM_NCACTIVATE都会发送相同的消息。这似乎没有多大帮助。它还告诉我窗口正在被激活,我不知道如何从中判断,我需要刷新标题栏,而不仅仅是绘制一个激活的标题栏。你能说得更具体一点吗?关键是它会多次发送信息。这样就让它闪光了。我明白了。。。显然,仅仅因为发送了停用消息并不意味着窗口的IsActive属性实际上发生了更改。这不是停用消息,而是WM_ACTIVATE。“NC”消息是“窗口框架的外观”消息。“NC”==非客户端。我希望它是一个新窗口,而不仅仅是一个控件@汉斯·帕桑给我指出了正确的方向。谢谢你的帮助!我希望它是一个新窗口,而不仅仅是一个控件@汉斯·帕桑给我指出了正确的方向。谢谢你的帮助!