C# WPF:如何制作自定义模式对话框flash?

C# WPF:如何制作自定义模式对话框flash?,c#,wpf,window,custom-controls,wndproc,C#,Wpf,Window,Custom Controls,Wndproc,通常,当您打开一个模态对话框并尝试单击它的父窗口时,模态对话框的标题栏会闪烁。在WPF中创建自定义、无边界、无铬的窗口时,您将失去所有功能,必须自己重新构建。我一直在四处张望,一辈子都不知道如何让模态窗口闪烁。虽然它仍然发出嘟嘟声 我想我将不得不关注WndProc中我必须处理的一些事件,但我不知道是哪个事件或如何处理。我试过观看窗口更改和窗口更改事件以及WM_激活事件,但都没有效果。我肯定我只是错过了一些简单的东西,但我会很感激在这方面的任何帮助。谢谢 如果您没有准确地找到您要查找的内容,那么有

通常,当您打开一个模态对话框并尝试单击它的父窗口时,模态对话框的标题栏会闪烁。在WPF中创建自定义、无边界、无铬的窗口时,您将失去所有功能,必须自己重新构建。我一直在四处张望,一辈子都不知道如何让模态窗口闪烁。虽然它仍然发出嘟嘟声


我想我将不得不关注WndProc中我必须处理的一些事件,但我不知道是哪个事件或如何处理。我试过观看窗口更改和窗口更改事件以及WM_激活事件,但都没有效果。我肯定我只是错过了一些简单的东西,但我会很感激在这方面的任何帮助。谢谢

如果您没有准确地找到您要查找的内容,那么有一种解决方法,即根本不使用模式窗口

以下是您如何做到这一点:

  • 创建一个名为MainContentUC的用户控件,并将MainWindow的内容放入其中
  • 创建另一个名为MessageBoxUC的用户控件,并将messagebox的内容放入其中

    <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)时,触发器会运行故事板并闪烁

    如果有多个窗口,则可以实现不同的控件模板,并使用模板选择器在它们之间进行选择。因此,您将使用


    如果您没有准确地找到要查找的内容,有一种解决方法,即根本不使用模式窗口

    以下是您如何做到这一点:

  • 创建一个名为MainContentUC的用户控件,并将MainWindow的内容放入其中
  • 创建另一个名为MessageBoxUC的用户控件,并将messagebox的内容放入其中

    <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)时,触发器会运行故事板并闪烁

    如果有多个窗口,则可以实现不同的控件模板,并使用模板选择器在它们之间进行选择。因此,您将使用

    我在附加到我的窗口的自定义行为中连接的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”==非客户端。我希望它是一个新窗口,而不仅仅是一个控件@汉斯·帕桑给我指出了正确的方向。谢谢你的帮助!我希望它是一个新窗口,而不仅仅是一个控件@汉斯·帕桑给我指出了正确的方向。谢谢你的帮助!