通常,当你打开一个模态对话框,并试图点击它的父窗口,模态对话框的标题栏 Flink 。当在WPF中创建一个自定义的、无边框的、无边框的窗口时,你将失去所有的功能,必须自己重建它。我看了很高很低,我的生活不知道如何让我的模态窗口 Flink 。尽管它还在响...我想我将不得不在WndProc中观察一些我必须处理的事件,但我不知道是哪个事件或如何处理。我试过观察窗口改变和窗口改变事件以及WM_ACTIVATE事件都无济于事。我肯定我只是错过了一些简单的东西,但我会很感激任何帮助。谢谢你,谢谢
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为我指明了正确的方向。
WndProc
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}"/>
<local:MainContentsUC/>
<ContentPresenter ContentTemplateSelector="{StaticResource mySelector}"/>
2条答案
按热度按时间nfeuvbwi1#
我在一个附加到我的窗口的自定义行为中连接的
WndProc
。它调用窗口的一个内部方法来适当地更新标题栏的颜色。感谢@Hans Passant为我指明了正确的方向。
33qvvth12#
如果你没有找到你要找的东西,有一个解决方法,就是不使用模态窗口。
你可以这样做:
1.创建一个名为MainContentUC的用户控件,并将MainWindow的内容放入其中
1.创建另一个名为MessageBoxUC的用户控件,并将消息框的内容放入其中
1.在MessageBoxUC中添加名为IsOpen的布尔依赖项属性(默认值=false)
1.编写主窗口的xaml代码如下:
这样,当MessageBoxUC打开时,它将阻止MainContentsUC被单击。当你点击后面的区域(颜色设置为#4FFF)时,触发器会运行故事板并 Flink 。
如果你有几个窗口,你可以实现不同的控件模板,并使用模板选择器在它们之间进行选择。因此,您将得到的不是
<local:MainContentsUC/>
,<ContentPresenter ContentTemplateSelector="{StaticResource mySelector}"/>