繁体   English   中英

WPF:如何使自定义模态对话框闪烁?

[英]WPF: How do I make a custom modal dialog flash?

通常,当您打开模态对话框并尝试单击它的父窗口时,模态对话框的标题栏会闪烁。 在 WPF 中创建自定义、无边框、无边框的窗口时,您将失去所有这些功能,必须自己重新构建它。 我看起来高高低低,终其一生都无法弄清楚如何让我的 Modal 窗口闪烁。 虽然它仍然发出哔哔声...

我想我将不得不在 WndProc 中观察一些我必须处理的事件,但我无法弄清楚是哪个事件或如何去做。 我试过观察窗口更改和窗口更改事件以及 WM_ACTIVATE 事件无济于事。 我确定我只是遗漏了一些简单的东西,但我很感激这方面的任何帮助。 谢谢!

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. 创建一个名为 MainContentUC 的用户控件并将 MainWindow 的内容放入其中
  2. 创建另一个名为 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>
  3. 在 MessageBoxUC 中添加一个名为 IsOpen 的布尔依赖属性(默认值=false)

  4. 编写主窗口的 xaml 代码如下:

     <Window xmlns:local="clr-namespace:MyWpfApplication"> <Grid> <local:MainContentsUC/> <local:MessageBoxUC/> </Grid> </Window>

这样,当 MessageBoxUC 打开时,它将阻止 MainContentsUC 被单击。 当您单击背面区域(其中颜色设置为 #4FFF)时,触发器会运行故事板并闪烁。

如果您有多个窗口,您可以实现不同的控件模板并使用模板选择器在它们之间进行选择。 所以,而不是<local:MainContentsUC/>你将有

<ContentPresenter ContentTemplateSelector="{StaticResource mySelector}"/>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM