2009-08-14 93 views
1

我想在Silverlight中製作一個類似於this的顏色選擇器,但我在實現大型方形區域中的遊標時遇到了問題。爲了跟蹤鼠標狀態,我有一個_isMouseDown變量。在MouseLeave事件_isMouseDown設置爲false,以便如果用戶拖出大方形區域,釋放,然後將鼠標移回,顏色選擇器光標將不會「跳轉」到鼠標並跟隨它(因爲_isMouseDown仍然是true)。然而MouseLeave事件似乎也會在光標被快速移動時觸發,導致顏色選擇器光標被「丟棄」。Silverlight鼠標離開問題

以下代碼足以重現此問題。嘗試快速拖動鼠標,橢圓將被「丟棄」。當MouseLeave事件被刪除時,問題消失。有沒有辦法解決這個「下降」問題,但仍然有我上面提到的行爲?

XAML:

<UserControl x:Class="SilverlightApplication1.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Canvas x:Name="LayoutRoot" Width="800" Height="600"> 
     <Rectangle Width="800" Height="600" MouseLeftButtonDown="TestMouseDown" 
      MouseLeftButtonUp="TestMouseUp" MouseMove="TestMouseMove" 
      MouseLeave="TestMouseLeave"> 
      <Rectangle.Fill> 
       <LinearGradientBrush> 
        <GradientStop Offset="0.00" Color="Crimson" /> 
        <GradientStop Offset="1.00" Color="Azure" /> 
       </LinearGradientBrush> 
      </Rectangle.Fill> 
     </Rectangle> 
     <Ellipse Name="TestEllipse" Width="50" Height="50" Fill="Green" /> 
    </Canvas> 
</UserControl> 

C#代碼隱藏:

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

namespace SilverlightApplication1 
{ 
    public partial class MainPage : UserControl 
    { 
     private bool _isMouseDown; 

     public MainPage() 
     { 
      InitializeComponent(); 
     } 

     private void TestMouseDown(object sender, MouseButtonEventArgs e) 
     { 
      _isMouseDown = true; 
      UpdatePosition(e.GetPosition(LayoutRoot)); 
     } 

     private void TestMouseUp(object sender, MouseButtonEventArgs e) 
     { 
      _isMouseDown = false; 
     } 

     private void TestMouseMove(object sender, MouseEventArgs e) 
     { 
      if (_isMouseDown) 
       UpdatePosition(e.GetPosition(LayoutRoot)); 
     } 

     private void TestMouseLeave(object sender, MouseEventArgs e) 
     { 
      _isMouseDown = false; 
     } 

     private void UpdatePosition(Point point) 
     { 
      Canvas.SetLeft(TestEllipse, point.X); 
      Canvas.SetTop(TestEllipse, point.Y); 
     } 
    } 
} 

回答

2

你應該看看上的UIElement的CaptureMouse方法。在這種情況下,你應該對你有所幫助。捕獲鼠標時,即使鼠標離開元素區域,您仍將繼續接收鼠標事件。然後您可以在適當的時候自願釋放鼠標捕獲。

1

然而MouseLeave事件也 似乎火的時候,光標鼠標 快速移動,導致 顏色選擇器光標是「下降」。

與您的代碼的問題是MouseLeave事件不僅在鼠標離開矩形時觸發,這也會在鼠標進入橢圓時觸發..因爲鼠標事件現在被路由到橢圓控件..(當你快速移動鼠標時不會觸發)

由於KeithMahoney建議,你可以嘗試CaptureMouse ...或者在橢圓的MouseEnter事件上設置_isMouseDown = true ..它可以工作..我dint測試你的代碼然後..只看到代碼告訴你...

0

我有一個類似的問題,就像你,我也改變了Canvas.LeftCanvas.Top從我的鼠標事件控制。

事情是,當我改變控件的位置時,我將控件的「下方」移動到鼠標上,將焦點放在該控件上,然後導致當前控件的MOUSE-LEAVE事件。

考慮將IsHistTestVisible切換爲您操作的控件的「FALSE」,以便將其移動到鼠標光標當前位置下時,不會觸發任何新事件。

一個完整的解決方案,例如,可以發現here

https://stackoverflow.com/a/13265880/1308645

我希望幫助。

Regards, Martin