我遇到了问题:
在当前窗口中触摸按钮后,另一个窗口将按ShowDialog()
打开。
这个新的对话窗口有唯一的按钮。单击处理程序关闭对话框窗口。
当我通过触摸ClickMode = Release
(默认模式)按钮打开对话框时,没有问题。
但!当我尝试通过按下ClickMode = Press
按钮来执行此操作时,将忽略第一次触摸对话框窗口。
它在win8 - win10中通过触摸再现(不是鼠标点击,鼠标一切正常)。
我想,在Dispatcher.PushFrame
内部ShowDialog()
存在一些问题,并在触摸输入中虚拟化鼠标事件。
有没有人有任何想法如何使ClickMode=Press
按钮与触摸和鼠标输入相同?
我的代码
MainWindow.xaml
<Window x:Class="SimpleTouchCrash.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Button x:Name="btnPress" ClickMode="Press" Click="BtnPress_OnClick" Height="100">Mode: Press</Button>
<Button x:Name="btnRelease" Click="BtnPress_OnClick" Height="100">Mode: Release</Button>
</StackPanel>
</Window>
MainWindow.xaml.cs
using System.Windows;
namespace SimpleTouchCrash
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
private void BtnPress_OnClick(object sender, RoutedEventArgs e)
{
var dlg= new Dialog();
dlg.ShowDialog();
}
}
}
Dialog.xaml
<Window x:Class="SimpleTouchCrash.Dialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Dialog" Height="300" Width="300">
<Grid>
<Button x:Name="btnCloseDialog" Click="BtnCloseDialog_OnClick">Close me!</Button>
</Grid>
</Window>
Dialog.xaml.cs
using System.Windows;
namespace SimpleTouchCrash
{
public partial class Dialog
{
public Dialog()
{
InitializeComponent();
}
private void BtnCloseDialog_OnClick(object sender, RoutedEventArgs e)
{
Close();
}
};
}
P.S。我知道有一个“黑客”禁用触摸输入: https://connect.microsoft.com/VisualStudio/Feedback/Details/1016534 但是在Windows 10 [11月1511发布]中使用这种“黑客”会导致异常。
System.ArgumentNullException: ???????? ?? ????? ???? ??????????????.
??? ?????????: key
? System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
? System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
? System.Windows.Input.StylusLogic.ProcessInputReport(RawStylusInputReport inputReport)
? System.Windows.Input.PenContext.FirePenInRange(Int32 stylusPointerId, Int32[] data, Int32 timestamp)
? System.Windows.Input.PenThreadWorker.FireEvent(PenContext penContext, Int32 evt, Int32 stylusPointerId, Int32 cPackets, Int32 cbPacket, IntPtr pPackets)
? System.Windows.Input.PenThreadWorker.ThreadProc()
? System.Threading.ThreadHelper.ThreadStart_Context(Object state)
? System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
? System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
? System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
? System.Threading.ThreadHelper.ThreadStart()
P.P.S。我知道MS Surface SDK https://www.microsoft.com/en-us/download/details.aspx?id=26716 但我无法使用它,因为我的应用程序也应该在Windows XP上运行。