首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WindowChrome按钮未按下-禁用时测试可见

WindowChrome按钮未按下-禁用时测试可见
EN

Stack Overflow用户
提问于 2022-10-04 09:00:00
回答 1查看 116关注 0票数 1

WPF中,可以使用WindowChrome自定义标题栏。只要记得设置WindowChrome.IsHitTestVisibleInChrome="True",在非客户端区域添加按钮就相当简单。

现在,当一个禁用的double-clicked.按钮是时,出现了一个错误或意外/奇怪的行为。什么都不应该发生,但是应用程序是最大化的。

复制步骤

  1. 创建一个新的WPF项目。最好是针对.NET 6
  2. 将下面的代码粘贴到MainWindow.xaml中。
  3. 运行应用程序,双击按钮。

Expected:什么都没发生

实战:应用程序被最大化

代码语言:javascript
运行
复制
<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>

我在这里错过了什么?是虫子吗?如果是的话,有解决办法吗?

更新

被接受的答案是正确的。在WindowChromeWorker.cs(670)中可以看到它工作的原因,对UIElement.InputHitTest的调用确实会跳过任何禁用的元素。然而,在第673项上,我们发现了允许建议的解决方案的魔力:

当父元素将WindowChrome.IsHitTestVisibleInChrome设置为true时,回调将正确返回HTCLIENT,从而有效地吞噬了我们的双击。

在提供的示例中,我们可以简单地将<Grid>替换为以下内容,以获得所需的行为:

代码语言:javascript
运行
复制
<Grid WindowChrome.IsHitTestVisibleInChrome="True">
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-04 11:06:50

双击标题栏将导致窗口更改其状态,

  1. 启用按钮后,双击将由按钮处理,而不会传递到标题栏。
  2. 当该按钮被禁用时,双击将传递到标题栏,如果您用任何禁用的UIElement替换该按钮,则会发生这种情况。

所以现在的行为是正常的。

有解决办法吗?

是的,如果您想禁用WindowState更改,而不管按钮的IsEnabled值如何,请使用另一个UI元素包装<Button/>,如果该按钮被禁用,将防止双击传递到窗口的标题栏。

代码语言:javascript
运行
复制
<ContentControl
    Grid.Row="0"
    Width="200"
    Height="28"
    VerticalAlignment="Top"
    WindowChrome.IsHitTestVisibleInChrome="True">
    <Button
        x:Name="MyButton"
        Content="I'm disabled! DOUBLE-CLICK ME!"
        IsEnabled="False" />
</ContentControl>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73945424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档