WPF工具栏溢出Touchinteraction停止App响应输入

时间:2017-09-29 11:02:51

标签: c# wpf touch desktop-application

问题说明

当使用触摸(屏幕)输入操作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>

其他想法

对我来说,只要溢出面板关闭,工具栏或OverflowToggleButton就会捕获鼠标设备。保持溢出面板打开可以防止冻结(在我的大应用程序中测试)

1 个答案:

答案 0 :(得分:0)

我在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

上面Thread中标记答案的第二个链接帮助了我: 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

基本上在Overflow里面的Button中的Click事件中,我将MouseCapture强制到Button并再次释放它:

代码落后(不再那么情绪化)

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