【问题标题】:WPF Toolbar Overflow Touchinteraction stops App responding to InputWPF工具栏溢出触摸交互停止应用程序响应输入
【发布时间】:2017-09-29 11:02:51
【问题描述】:

问题描述

当使用触摸(屏幕)输入来操作 WPF 工具栏溢出内的按钮时,应用程序停止响应鼠标和触摸输入。键盘输入或任何代码执行(即使在 UI 线程中)似乎不受影响。将鼠标移到 Windows 内容区域之外会释放冻结,并且可以再次使用应用程序(直到再次使用溢出)。

它有时会直接发生在第一次交互时,通常您可以在“冻结”发生之前操作几次按钮。

使用鼠标访问溢出内的按钮时不会发生“冻结”。

测试环境

我做了一个小型测试项目来验证它不是我的应用程序中的东西,并且我能够验证 .NET 4.5.2、4.6.1 和 4.7 的问题。

它已在两台具有不同触摸屏的不同 Windows 7 PC 上进行了测试。两者的结果相同。

代码:

<Window x:Class="ToolBarTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ToolBarTest"
    mc:Ignorable="d"
    Title="MainWindow"
    Height="350"
    Width="525">
<DockPanel>
    <ToolBarTray DockPanel.Dock="Top">
    <ToolBar>
        <Button Content="New" />
        <Button Content="Open" />
        <Button Content="Save" />
    </ToolBar>
    <ToolBar>
        <Button Content="Cut" />
        <Button Content="Copy" />
        <Button Content="Paste" />
        <Button ToolBar.OverflowMode="Always">
            <Grid>
                <TextBlock Text="Testbutton" />
            </Grid>
        </Button>
        </ToolBar>
    </ToolBarTray>
    <TextBox AcceptsReturn="True" />
</DockPanel>

其他想法

在我看来,一旦溢出面板关闭,工具栏或溢出切换按钮就会捕获鼠标设备。保持溢出面板打开确实可以防止冻结(在我的大应用程序中测试)

【问题讨论】:

    标签: c# wpf touch desktop-application


    【解决方案1】:

    我在 MSDN 上交叉发布了这个问题:https://social.msdn.microsoft.com/Forums/de-DE/c4e6061d-ecc1-4c7e-afe9-2587cfd2734d/fenster-bekommt-keine-maus-und-touchevents-mehr-nach-touch-interaktion-mit-toolbar-overflow?forum=wpfde

    上面线程中标记答案的第二个链接帮助了我: https://social.msdn.microsoft.com/Forums/de-DE/d964afd2-67d4-4dfb-b118-695ab07ef6c1/wpf-popups-and-touch-input-can-cause-ui-to-become-unresponsive?forum=wpf

    基本上在溢出内的按钮的单击事件中,我将鼠标捕获强制到按钮并再次释放它:

    代码背后(不再那么空洞)

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            CaptureMouse();
            ReleaseMouseCapture();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多