WPF中禁用的WindowChrome按钮双击触发窗口最大化异常问题
WPF WindowChrome下禁用按钮双击触发窗口最大化问题
问题描述
在WPF中使用WindowChrome自定义标题栏时,给禁用状态的按钮设置WindowChrome.IsHitTestVisibleInChrome="True",双击该按钮会意外触发窗口最大化,而非预期的无任何响应。
复现步骤
- 创建目标框架为.NET 6的WPF新项目
- 将以下XAML代码替换MainWindow.xaml内容
- 运行程序后双击禁用的按钮
预期结果:无任何反应
实际结果:窗口自动最大化
<Window x:Class="WpfChromeTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" WindowStyle="None" Height="450" Width="800"> <WindowChrome.WindowChrome> <WindowChrome CaptionHeight="20" /> </WindowChrome.WindowChrome> <Window.Template> <ControlTemplate TargetType="{x:Type Window}"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="32" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Button Grid.Row="0" Width="200" Height="28" VerticalAlignment="Top" Content="I'm disabled! DOUBLE-CLICK ME!" WindowChrome.IsHitTestVisibleInChrome="True" IsEnabled="False" /> </Grid> </ControlTemplate> </Window.Template> </Window>
原因分析
这是WPF WindowChrome的内部逻辑问题:
- 在
WindowChromeWorker.cs第670行,UIElement.InputHitTest方法会跳过禁用状态的元素,导致双击事件无法被按钮捕获 - 第673行逻辑显示,当父元素未设置
WindowChrome.IsHitTestVisibleInChrome="True"时,系统会将该区域判定为非客户区,触发窗口最大化的默认双击行为
解决方法
给按钮的父容器(示例中的Grid)添加WindowChrome.IsHitTestVisibleInChrome="True"属性,让父容器接管点击区域的判定,避免系统将双击事件识别为非客户区操作。修改后的核心代码如下:
<Grid WindowChrome.IsHitTestVisibleInChrome="True"> <Grid.RowDefinitions> <RowDefinition Height="32" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Button Grid.Row="0" Width="200" Height="28" VerticalAlignment="Top" Content="I'm disabled! DOUBLE-CLICK ME!" WindowChrome.IsHitTestVisibleInChrome="True" IsEnabled="False" /> </Grid>
内容的提问来源于stack exchange,提问作者l33t
相关产品推荐
相关产品推荐

