WPF:如何制作自定义模式对话框Flash?

z31licg0  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(149)

通常,当你打开一个模态对话框,并试图点击它的父窗口,模态对话框的标题栏 Flink 。当在WPF中创建一个自定义的、无边框的、无边框的窗口时,你将失去所有的功能,必须自己重建它。我看了很高很低,我的生活不知道如何让我的模态窗口 Flink 。尽管它还在响...
我想我将不得不在WndProc中观察一些我必须处理的事件,但我不知道是哪个事件或如何处理。我试过观察窗口改变和窗口改变事件以及WM_ACTIVATE事件都无济于事。我肯定我只是错过了一些简单的东西,但我会很感激任何帮助。谢谢你,谢谢

nfeuvbwi

nfeuvbwi1#

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为我指明了正确的方向。

33qvvth1

33qvvth12#

如果你没有找到你要找的东西,有一个解决方法,就是不使用模态窗口。
你可以这样做:
1.创建一个名为MainContentUC的用户控件,并将MainWindow的内容放入其中
1.创建另一个名为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>

1.在MessageBoxUC中添加名为IsOpen的布尔依赖项属性(默认值=false)
1.编写主窗口的xaml代码如下:

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

这样,当MessageBoxUC打开时,它将阻止MainContentsUC被单击。当你点击后面的区域(颜色设置为#4FFF)时,触发器会运行故事板并 Flink 。
如果你有几个窗口,你可以实现不同的控件模板,并使用模板选择器在它们之间进行选择。因此,您将得到的不是<local:MainContentsUC/>
<ContentPresenter ContentTemplateSelector="{StaticResource mySelector}"/>

相关问题