1

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

次のコードは、問題を再現するのに十分です。マウスをすばやくドラッグしてみると、楕円が「ドロップ」されます。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);
        }
    }
}
4

3 に答える 3

2

UIElementのCaptureMouseメソッドを確認する必要があります。このような状況で役立つはずです。マウスをキャプチャすると、マウスが要素の領域を離れた場合でも、マウスイベントを引き続き受信します。その後、適切な場合はいつでも、マウスキャプチャを自発的に解放できます。

于 2009-08-14T05:22:38.870 に答える
1

ただし、MouseLeaveイベントは、カーソルがマウスにすばやく移動したときにも発生するようで、カラーピッカーカーソルが「ドロップ」されます。

コードの問題は、マウスが長方形を離れるときにだけでなく、マウスが楕円に入るときにも発生するということです。これは、マウスイベントが楕円コントロールにルーティングされるためです(移動したときに発生するわけではありません)。マウスをすばやく)。

KeithMahoneyが示唆しているように、uはCaptureMouseを試すことができます...または楕円のMouseEnterイベントで_isMouseDown=trueを設定します。

于 2009-08-14T07:22:56.383 に答える
0

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

つまり、コントロールの位置を変更したときに、そのコントロールをマウスの「下」に「移動」し、代わりにそのコントロールにフォーカスを置いたため、現在のコントロールに対してMOUSE-LEAVEイベントが発生しました。

操作するコントロールのを「FALSE」に切り替えることを検討IsHistTestVisibleしてください。これにより、マウスカーソルの現在の位置の下に移動しても、新しいイベントがトリガーされなくなります。

完全な解決策と例はここにあります

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

それがお役に立てば幸いです。

よろしく、マーティン

于 2012-11-07T08:43:54.097 に答える