2015-09-01 82 views
1

我想啓用Drag'n'Drop的一個父控制器,它有一個IsManipulationEnabled = trueWPF Drag&Drop vs操作

當啓用操作時,觸摸事件不會升級爲鼠標事件。爲了啓用升級,您應該在操作邏輯步驟之前處理觸摸事件(請參閱example)。我已經嘗試過,它的工作原理......直到我第一次撥打DoDragDrop。然後我不再接收鼠標事件。爲什麼?

下面是重現此問題的最低代碼。爲了便於閱讀,刪除了所有拖放操作。

XAML:

<Window x:Class="Test.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" Height="300" Width="300" IsManipulationEnabled="True"> 
    <Grid> 
     <Border Background="Red" 
       x:Name="Border" 
       TouchDown="Border_OnTouchDown" 
       MouseDown="Border_OnMouseDown" 
       TouchUp="Border_OnTouchUp" 
       Width="100" Height="50" /> 
    </Grid> 
</Window> 

C#:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void Border_OnTouchDown(object sender, TouchEventArgs e) 
    { 
     Debug.WriteLine("Border_OnTouchDown"); 
     e.Handled = true; 
     e.TouchDevice.Capture((FrameworkElement)sender); 
    } 

    private void Border_OnMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     Debug.WriteLine("Border_OnMouseDown!"); 
     DragDrop.DoDragDrop((DependencyObject)sender, "", DragDropEffects.All); 
    } 

    protected override void OnManipulationStarted(ManipulationStartedEventArgs e) 
    { 
     Debug.WriteLine("OnManipulationStarted"); 
     base.OnManipulationStarted(e); 
    } 

    private void Border_OnTouchUp(object sender, TouchEventArgs e) 
    { 
     ((FrameworkElement)sender).ReleaseTouchCapture(e.TouchDevice); 
     e.Handled = true; 
    } 
} 

輸出:

Border_OnTouchDown 
Border_OnMouseDown! <- works first time 
Border_OnTouchDown 
Border_OnTouchDown <- no longer works, no matter how many times I tap 
Border_OnTouchDown 
Border_OnTouchDown 
Border_OnTouchDown 
... 

如果我不叫DoDragDropMouseDown - 事件得到提升,因爲他們應該。

回答

0

該解決方案適用於任何框架的版本:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Border_OnTouchDown(object sender, TouchEventArgs e) 
    { 
     Debug.WriteLine("Border_OnTouchDown"); 

     IsManipulationEnabled = false; 
     e.TouchDevice.Capture(Border); 
    } 

    private void Border_OnMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     Debug.WriteLine("Border_OnMouseDown!"); 
     DragDrop.DoDragDrop((DependencyObject)sender, "", DragDropEffects.All); 
    } 

    protected override void OnManipulationStarted(ManipulationStartedEventArgs e) 
    { 
     Debug.WriteLine("OnManipulationStarted"); 
     base.OnManipulationStarted(e); 
    } 

    private void Border_OnTouchUp(object sender, TouchEventArgs e) 
    { 
     Border.ReleaseTouchCapture(e.TouchDevice); 
     IsManipulationEnabled = true; 
    } 
} 

在這裏,我們基本上禁用操作,如果用戶觸摸的Border。由於拖放操作可能(也可能會)在Border之外結束,因此我們還需要捕獲觸摸輸入以確保接收到TouchUp事件以重新啓用操作。

2

看起來像這是在.NET中的錯誤。我安裝了v4.5.2。現在我已經安裝了v4.6並且問題不再可重現。

我甚至不需要將項目重定向到v4.6或重新編譯它:只需安裝新的運行時即可修復所有問題。