2015-12-02 60 views
0

當鼠標在拖動時移動時,我想獲取鼠標位置。拖動時始終獲取鼠標位置

這是我最小的不工作例如:

MainWindow.xaml:

<Window x:Class="WpfApplication8.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"> 
    <Canvas x:Name="_canvas" Background="Green"> 
     <TextBlock x:Name="_positionTextBlock"/> 
     <Rectangle x:Name="_dragSource" 
        Width="20" 
        Height="50" 
        Fill="Blue" 
        Canvas.Top="150" 
        Canvas.Left="20" 
        PreviewMouseDown="DoDrag"/> 
     <Rectangle x:Name="_dragTarget" 
        Width="60" 
        Height="70" 
        Fill="Red" 
        Canvas.Top="110" 
        Canvas.Left="300" 
        AllowDrop="True"/> 
    </Canvas> 
</Window> 

MainWindow.xaml.cs:

using System.Windows; 
using System.Windows.Input; 

namespace WpfApplication8 
{ 
    /// <summary> 
    /// Interaktionslogik für MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void DoDrag(object sender, MouseButtonEventArgs e) 
     { 
      DragDrop.DoDragDrop(_dragSource, "abc", DragDropEffects.Move); 
     } 
    } 
} 

正如你所看到的:我有一個名爲TextBlock_positionTextBlock它應該在拖動時顯示當前的鼠標位置。

編輯(長故事):我有一個綠色的直角,可以在紅色的矩形上拖動和下垂。我的要求是,拖動綠色矩形時顯示鼠標位置。

我該怎麼做?

我曾嘗試:

改變MainWindow構造函數:

public MainWindow() 
{ 
    InitializeComponent(); 
    DragOver += (s, e) => _positionTextBlock.Text = e.GetPosition(_canvas).ToString(); 
} 

但是這隻能說明位置,當鼠標在紅色矩形。

我也試過:

public MainWindow() 
{ 
    InitializeComponent(); 
    MouseMove += (s, e) => _positionTextBlock.Text = e.GetPosition(_canvas).ToString(); 
} 

但同時拖動

我也試過MouseMove - 活動不火:

private void DoDrag(object sender, MouseButtonEventArgs ev) 
{ 
    _dragSource.GiveFeedback += 
     (s, e) => _positionTextBlock.Text = Mouse.PrimaryDevice.GetPosition(_canvas).ToString(); 
    DragDrop.DoDragDrop(_dragSource, "abc", DragDropEffects.Move); 
} 

但這似乎得到窗口位置在屏幕座標。

而這就是我卡住的地方。有人有什麼主意嗎?使用PreviewMouseMove

第二個編輯

+0

嘗試QueryContinueDrag事件。 – Maximus

+0

我試過了,但是有''GiveFeedback'事件,沒有'GetPosition()' –

回答

0

編輯:全樣本

XAML:

<Canvas x:Name="_canvas" Background="Green"> 
    <TextBlock x:Name="_positionTextBlock"/> 
    <Rectangle x:Name="_dragSource" 
       Width="20" 
       Height="50" 
       Fill="Blue" 
       Canvas.Top="150" 
       Canvas.Left="20" 
       PreviewMouseMove="DragSourcePreviewMouseMove"/> 
    <Rectangle x:Name="_dragTarget" 
       Width="60" 
       Height="70" 
       Fill="Red" 
       Canvas.Top="110" 
       Canvas.Left="300" 
       AllowDrop="True"/> 
</Canvas> 

代碼隱藏:

public MainWindow() 
{ 
    InitializeComponent(); 
} 

private void DragSourcePreviewMouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.LeftButton == MouseButtonState.Pressed) 
    { 
     _positionTextBlock.Text = e.GetPosition(_canvas).ToString(); 
    } 
    e.Handled = true; 
} 

希望這有助於。

+0

爲什麼要這樣工作?你已經在事件處理程序中添加了一個'if'。但問題是,事件不會發生。因此事件處理程序沒有被調用! (無視事實,這不會編譯...) –

+0

@ Rico-E我編輯它使用PreviewMouseMove,它適用於我。還請記住將事件標記爲已處理。 – Natxo

+0

它不適合我。 'PreviewMouseMove'事件不會被觸發,所以處理程序永遠不會被調用。 –