WindowStyle无和触摸输入

时间:2017-07-19 09:12:00

标签: wpf textbox windows-10 touch

在Windows 10中,当使用像Surface这样的触摸设备时,在非最大化的窗口中触摸像TextBox这样的输入控件会导致整个窗口向上移动,这样用户就可以看到他正在键入的内容(如果键盘已停靠) 。但是WindowStyle is set to none时不会发生这种情况。为什么不发生? 我们的应用中需要这种行为。可以在WindowStyle = None上修复吗?我发现它与它的风格没有联系 - 没有构建触发器或其他东西。对于自定义关闭按钮栏,我们需要WindowsStyle = None(我们希望条形图是透明的,只有按钮可见)。 WindowStyle None and touch input enter image description here

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,试图让我的应用程序对Windows 10触摸键盘的存在做出正确的反应,但是除非将WindowStyle设置为None以外的其他东西,否则我不会这样做。

苦苦挣扎了一段时间,直到我决定自己尝试为Window设置样式并手动删除边框,这使我发现了WindowChrome类。

WindowChrome documentation提到了关于WindowStyle="None"的这一点:

  

自定义WPF应用程序窗口外观的一种方法是将Window.WindowStyle属性设置为None。 这会从窗口中删除非客户框架,只留下客户区域,您可以在其中应用自定义样式。但是,当删除非客户端框架时,您还将丢失其提供的系统功能和行为,例如字幕按钮和窗口大小调整。另一个副作用是,最大化该窗口时它将覆盖Windows任务栏。设置WindowStyle.None使您可以创建完全自定义的应用程序,但还要求您在应用程序中实现自定义逻辑以模拟标准窗口行为。

因此,我的猜测是因为缺少此非客户端(或OS)框架,因此导致应用程序无法对键盘的存在做出反应。

解决方案是实现自定义WindowChrome。这可以通过在Window中添加以下using指令来完成:

xmlns:shell="clr-namespace:System.Windows.Shell;assembly=PresentationFramework"

然后在您的窗口上设置WindowChrome附加属性:

<shell:WindowChrome.WindowChrome>
    <shell:WindowChrome NonClientFrameEdges="None"
                        UseAeroCaptionButtons="False"
                        CornerRadius="0"
                        GlassFrameThickness="0"
                        ResizeBorderThickness="0"
                        CaptionHeight="0" />
    </shell:WindowChrome.WindowChrome>
</shell:WindowChrome.WindowChrome>

示例:

<Window x:Class="WpfApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:shell="clr-namespace:System.Windows.Shell;assembly=PresentationFramework"
    Title="MainWindow" Height="350" Width="525" WindowState="Maximized">
    <shell:WindowChrome.WindowChrome>
        <shell:WindowChrome NonClientFrameEdges="None"
                            UseAeroCaptionButtons="False"
                            CornerRadius="0"
                            GlassFrameThickness="0"
                            ResizeBorderThickness="0"
                            CaptionHeight="0" />
    </shell:WindowChrome.WindowChrome>

    <Grid Background="DarkOrange">
        <TextBlock Text="TEST" VerticalAlignment="Center" 
                   HorizontalAlignment="Center" FontSize="32" />
    </Grid>
</Window>

如果您想将自己的自定义按钮添加到标题栏,请查看this excellent post有关样式化Window的信息。

希望这会有所帮助!

更新:

经过进一步调查,结果发现该解决方案仅适用于Windows 10版本 1903 。在我们用于生产的 1809 上尝试过时,此方法无效。原因是微软显然已经改变了应用程序在全屏模式下对触摸键盘的反应方式。

可以通过在两个Windows版本中最​​大化资源管理器来轻松地进行测试,并查看在1809年什么也没有发生,但是在1903年,调整了窗口的大小以适合屏幕上的剩余空间。

我注意到的另一件重要的事情是,当我从Visual Studio启动应用程序时(无论是否附加了调试器),当触摸屏显示时,UI不会对其做出反应,但是当我从资源管理器运行可执行文件时,它确实起作用。因此,在测试中,我将始终进行构建,然后转到bin \ Debug,然后从此处启动exe。

答案 1 :(得分:0)

将网格布局划分为3行,并将一个自定义按钮添加到行的右上角,并在该按钮事件处理程序上执行窗口关闭代码,同样用于最小化

并设置WindowStyle = none