2009-08-14 15 views
1

私はSilverlightでthisと似たカラーピッカーを作成しようとしていますが、大きな正方形領域にカーソルを実装するのに問題があります。マウスの状態を追跡するために、私は_isMouseDownという変数を持っています。 MouseLeaveのイベント_isMouseDownfalseに設定されているため、ユーザーが大きな正方形領域からドラッグして離してマウスを戻すと、カラーピッカーカーソルがマウスに「ジャンプ」して移動することはありません_isMouseDownは依然としてtrueである)。しかし、MouseLeaveイベントは、カーソルがマウスをすばやく動かしたときに発火し、カラーピッカーのカーソルが「ドロップ」しているように見えます。Silverlight MouseLeave Issue

次のコードで問題を再現できます。マウスをすばやくドラッグすると、楕円が「ドロップ」されます。 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を試してみるか、ellipseのMouseEnterイベントで_isMouseDown = trueを設定することができます。まだ..コードを見てあなたに伝えているだけです...

0

私も同様の問題がありました。あなたと同じように、Canvas.Leftとも変更しました私のマウスイベントからのコントロールの3210。

私はコントロールの位置を変更したときに、そのコントロールをマウスの下に「移動」させ、そのコントロールにフォーカスを置き、現在のコントロールのMOUSE-LEAVEイベントを発生させました。

操作するコントロールのIsHistTestVisibleを "FALSE"に切り替えることを検討してください。マウスカーソルの現在の位置の下に移動すると、新しいイベントは発生しません。

完全なソリューションと例は

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

私はそれが役に立てば幸いhereを見つけることができます。

よろしく、マーティン