سؤال

أنا أستجيب لأحداث mouseleftbuttondown على العناصر المضافة إلى قماش WPF. كل شيء يعمل بشكل جيد عند النقر فوق (أي EventHandler ينطلق بشكل صحيح)، ولكنه يتطلب الكثير من الدقة من مؤشر الماوس. يجب أن تكون على رأس الدائرة تماما لجعلها تعمل. أحتاج إلى أن تكون أكثر قليلا متسامح؛ ربما ما لا يقل عن 1 أو 2 بيكسليس تسامح. العناصر الموجودة على القماش هي دوائر كبيرة لطيفة (بحجم الربع على الشاشة)، وبالتالي فإن الدوائر نفسها ليست صغيرة جدا، ولكن السباغة من كل واحد هو 1، لذلك هو خط رفيع.

يمكنك رؤية لقطة شاشة هنا: http://twitpic.com/1f2ci/full.

معظم تطبيق الرسومات ليس هذا صعب الإرضاء عن اختيار الماوس، لذلك أريد أن أعطي المستخدم تجربة مألوفة.

كيف يمكنني أن أجعلها أكثر تسامحا قليلا.

هل كانت مفيدة؟

المحلول

يمكنك ربط الحدث MouseftButTondonnown لكائن تخطيط الجذر بدلا من ذلك، وتحقق من العناصر الموجودة في النطاق من نقرة عن طريق القيام بذلك:

List<UIElement> hits = System.Windows.Media.VisualTreeHelper.FindElementsInHostCoordinates(Point, yourLayoutRootElement) as List<UIElement>;  

http://msdn.microsoft.com/en-us/library/cc838402(VS.95).aspx.

بالنسبة لمعلمة النقطة، يمكنك استخدام المعلمة MOACEEVENTARGS E، واستدعاء طريقة getposition مثل هذا:

Point p = e.GetPosition(null)

لا أستطيع أن أتذكر ما إذا كنت تريد استخدامها بدلا من findelementsinhostcoordsinates. حاول كليهما.
http://msdn.microsoft.com/en-us/library/ms608752.aspx.

يمكنك إنشاء كائنات 4 نقاط من موضع الماوس لإنشاء تأثير استساحة مزيف، والاتصال إما findelementsinhostcoordinates أو الحمر لجميع النقاط الأربعة.

نصائح أخرى

قد ترغب في محاولة ملء الدائرة بالألوان الشفافة لجعل الدائرة كلها قابلة للنقر ...

إذا فشل ذلك، يمكنك أيضا رسم دوائر المساعد في نفس الموقع مثل الدوائر الأخرى. جعل الدائرة الأمامية اللون شفافة، وجعل سمك الفرشاة بضع بكسل أوسع لمنطقة أكثر قبولا قابلة للنقر حول الدائرة ..

أتمنى أن يساعدك هذا!

أعتقد أنني فعلت ذلك (معكم تساعد على بدء تشغيلي) ...

أولا، لقد نقلت نقل الحدث إلى الحدث إلى قماش بدلا من كل القطع الناقص. هذا جيد وسوء، من وجهة نظر Oop. على الأقل عندما يكون التعامل مع حدث الماوس مسؤولية Holepattern لتعيينه على كل فتحة (القطع الناقص الذي هو مرئي الحفرة)، فإنه مستخرج بعيدا حتى يحصل أي مستهلك من Holepattern على هذا functioanality. ومع ذلك، من خلال نقله إلى رمز UI الرئيسي، أنا الآن أتعامل مع حدث ماوس قماش بلدي على مستوى أعلى. لكن هذا ليس كل شيء سيئ أيضا. يمكننا مناقشة هذا الجزء لعدة أيام.

النقطة هي، لقد صممت طريقة لإنشاء "هامش خطأ" عند اختيار شيء على قماش مع الماوس، ثم قراءة الفتحة التي تنتمي القطع الناقص المحدد إليها، ثم يمكنني قراءة holepattern التي تنتمي إليها الثقب إلى، ويتم تحديث جميع واجهة المستخدم الخاصة بي (ListView، TextBoxes، GridView Fo) من خلال ربط XAML الموجود، ويتم تحديث القماش مع مكالمة واحدة إلى طريقة موجودة لتجديد القماش.

أن نكون صادقين، لا أستطيع أن أصدق أنني أحسب كل هذا خارج (بمساعدتك والآخرين أيضا، بالطبع). هذا شعور بارد أن يكون لديك رؤية هذا هذا ورؤيتها.

تحقق من القانون الرئيسي هنا:

void canvas1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    int ClickMargin = 2;
    Point ClickedPoint = e.GetPosition(canvas1);
    Point p1 = new Point(ClickedPoint.X - ClickMargin, ClickedPoint.Y - ClickMargin);
    Point p2 = new Point(ClickedPoint.X - ClickMargin, ClickedPoint.Y + ClickMargin);
    Point p3 = new Point(ClickedPoint.X + ClickMargin, ClickedPoint.Y + ClickMargin);
    Point p4 = new Point(ClickedPoint.X + ClickMargin, ClickedPoint.Y - ClickMargin);
    var PointPickList = new Collection<Point>();
    PointPickList.Add(ClickedPoint);
    PointPickList.Add(p1);
    PointPickList.Add(p2);
    PointPickList.Add(p3);
    PointPickList.Add(p4);

    foreach (Point p in PointPickList)
    {
        HitTestResult SelectedCanvasItem = System.Windows.Media.VisualTreeHelper.HitTest(canvas1, p);
        if (SelectedCanvasItem.VisualHit.GetType() == typeof(Ellipse))
        {
            var SelectedEllipseTag = SelectedCanvasItem.VisualHit.GetValue(Ellipse.TagProperty);
            if (SelectedEllipseTag!=null &&  SelectedEllipseTag.GetType().BaseType == typeof(Hole))
            {
                Hole SelectedHole = (Hole)SelectedEllipseTag;
                SetActivePattern(SelectedHole.ParentPattern);
                SelectedHole.ParentPattern.CurrentHole = SelectedHole;

            }
        }
    }
}

فقط زيادة سمك السكتة الدماغية من القطع الناقص بحيث يكون قابل للتعديل

وبالتالي فإن حدث mouseleftbuttondondown يعمل مثال: في علامة القطع الناقص:

الشكل البيضاوي canvas.left = "10" canvas.top = "133" الارتفاع = "24" اسم = "ellipse1" العرض = "23" السكتة الدماغية = "الأحمر" mouseleftbuttondondown = "ellipse1_mouseleftbutondondown" tooltip = "temp close" flactendlecap = "شقة" Strokethickness = "12"

Vid Private Void ELLIPSE1_MOUSELEFTBUTTONDONDOWN (كائن المرسل، MouseButtonventargs E) {تطبيق Curapp = Application.current؛ curapp.shutdown ()؛ }

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top