问题说明
当使用触摸(屏幕)输入操作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就会捕获鼠标设备。保持溢出面板打开可以防止冻结(在我的大应用程序中测试)
答案 0 :(得分:0)
上面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();
}