Wpf WindowsStyle无和触摸输入

Wpf WindowsStyle无和触摸输入,wpf,textbox,windows-10,touch,Wpf,Textbox,Windows 10,Touch,在Windows 10中,当使用触摸设备(如Surface)时,触摸输入控件(如未最大化窗口中的文本框)会导致整个窗口向上移动,以便用户可以看到他正在键入的内容(如果键盘已固定)。但是当WindowStyle设置为none时,不会发生这种情况。为什么它没有发生我们需要在应用程序中使用此行为。是否可以在WindowsStyle=None上修复此行为?我发现这与它的风格无关——没有内置触发器之类的东西。自定义关闭按钮栏需要WindowsStyle=None(我们希望该栏是透明的,只有按钮可见)。 将

在Windows 10中,当使用触摸设备(如Surface)时,触摸输入控件(如未最大化窗口中的文本框)会导致整个窗口向上移动,以便用户可以看到他正在键入的内容(如果键盘已固定)。但是当
WindowStyle设置为none
时,不会发生这种情况。为什么它没有发生我们需要在应用程序中使用此行为。是否可以在WindowsStyle=None上修复此行为?我发现这与它的风格无关——没有内置触发器之类的东西。自定义关闭按钮栏需要WindowsStyle=None(我们希望该栏是透明的,只有按钮可见)。

将网格布局分成3行,在行的右上角添加一个自定义按钮,并在该按钮事件处理程序上执行窗口关闭代码和相同的最小化操作


设置WindowStyle=none

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

为此我挣扎了一段时间,直到我决定自己尝试设计窗口样式并手动删除边框,这让我发现了
WindowChrome

关于
WindowStyle=“None”
中提到了这一点:

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

因此,似乎由于缺少此非客户端(或操作系统)框架,导致应用程序无法对键盘的存在作出反应

解决方案是实现自定义的
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>

如果绝对必须使用
WindowStyle=“None”
,则根据上述文档,窗口逻辑必须是自定义的。幸运的是,微软提供了一个很好的例子,说明了如何编写自定义逻辑来应对触摸键盘的出现:

如果要将自己的自定义按钮添加到标题栏,请查看“关于设置窗口样式”

希望这有帮助

更新:

经过进一步调查,该解决方案仅适用于Windows 10版本1903。当我们在生产中使用的1809上试用时,它不起作用。原因显然是微软改变了应用程序在全屏模式下对触摸键盘的反应方式

通过在两个版本的Windows中最大化资源管理器,可以很容易地测试这一点,并查看如何在1809年什么都没有发生,但在1903年,窗口的大小被调整以适应屏幕上的剩余空间


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

问题并不明显-我将其编辑为更清晰。我们的应用程序中需要这种行为。当WindowsStyle为none时,我希望应用程序在关注输入时移动,不幸的是它没有。