我有一个wpf应用程序,我在Windows 7中编写并且工作得很好。我正在移植到Windows 8.1,触摸事件的行为完全不同。
我编写了一个控件,当拖放到另一个相同类型的控件上时,它会切换位置。下面是控件的previewTouchDown和Drop处理程序。
private void UserControl_PreviewTouchDown(object sender, TouchEventArgs e)
{
DragDrop.DoDragDrop(this, _comparisonElement, DragDropEffects.Copy);
}
private void UserControl_Drop(object sender, DragEventArgs e)
{
ComparisonCopy from = (ComparisonCopy)e.Data.GetData("comparisonFormat");
ComparisonCopy to = (ComparisonCopy)_comparisonElement.GetData("comparisonFormat");
if (from != to)
{
ComparisonEventArgs args = new ComparisonEventArgs();
args.from = from;
args.to = to;
this.ComparisonMoved(sender, args);
e.Handled = true;
}
}
在Windows 8.1中运行此操作会导致拖放操作一次。一旦它工作,它将永远不会再工作。看起来初始拖放处于卡住状态。
我尝试过使用DragMove事件,这会允许多次切换,但是,它会随机切换控件。一旦我触摸屏幕上的另一个控件,它将用那个控件替换最后一个控件。再一次,似乎某种感觉被卡住了。
使用鼠标执行此操作的工作时间为100%。
感谢您的帮助。 -Matt
答案 0 :(得分:2)
我在Windows 8.1中使用了这篇文章Drag-and-Drop with Touch on Windows 7中的代码示例,并且看到了类似的内容。
在更改代码以处理TouchMove而不是TouchDown之前,Drop事件根本不会触发。我最终得到的是:
<StackPanel>
<Label Content="StackOverflow" HorizontalAlignment="Center"
TouchMove="Label_TouchMove" />
<Label Content="Drag to here"
HorizontalAlignment="Center"
AllowDrop="True" Drop="Label_Drop" />
</StackPanel>
// Drag source
private void Label_TouchMove(object sender, TouchEventArgs e)
{
Label l = e.Source as Label;
DragDrop.DoDragDrop(l, l.Content + " was Dragged!", DragDropEffects.Copy);
}
// Drag target
private void Label_Drop(object sender, DragEventArgs e)
{
string draggedText = (string)e.Data.GetData(DataFormats.StringFormat);
Label l = e.Source as Label;
l.Content = draggedText;
}
但是现在拖动完成后会激发额外的TouchMove。我发现没有理由这样做。