سؤال

انا استخدم Lesters DraganddropManager للحصول على وظيفة السحب والإفلات في طلبي وأحب حقًا الطريقة التي يتم تنفيذه ، لكن لدي مشكلة واحدة صغيرة ، وهذه هي أنني أريد أن أظهر سلك الماوس أثناء السحب في شريط الحالة الخاص بي ، فكيف أرسل الموضع من Dropmanager إلى رمز XAML الخاص بي.

لقد حاولت إضافة اعتماد في المدير يمكنني ربطه في XAML-Code.

    public static readonly DependencyProperty MousePointProperty =
        DependencyProperty.RegisterAttached("MousePoint", typeof(Point), typeof(DragDropBehavior),
        new FrameworkPropertyMetadata(default(Point)));
    public static void SetMousePoint(DependencyObject depObj, bool isSet)
    {
        depObj.SetValue(MousePointProperty, isSet);
    }
    public static IDragSourceAdvisor GetMousePoint(DependencyObject depObj)
    {
        return depObj.GetValue(MousePointProperty) as IDragSourceAdvisor;
    }

وفي XAML ، ارتبط به مثل هذا.

    <StatusBar>
        <TextBlock Text="{Binding local:DragDropBehavior.MousePoint.X}"/>
    </StatusBar>

ولكن كيف يمكنني تعيين mousecordintation على repareCyproperty في المدير؟

    private static void DropTarget_PreviewDragOver(object sender, DragEventArgs e)
    {
        if (UpdateEffects(sender, e) == false) return;
        //-- Update position of the preview Adorner
        Point position = GetMousePosition(sender as UIElement);

        //-- Here I Want to do this, but that not posible because the SetMousePoint takes a dependencyObject and not my value.
        //-- SetMousePoint(position);

        _draggedUIElementAdorner.Left = position.X - _offsetPoint.X;
        _draggedUIElementAdorner.Top = position.Y - _offsetPoint.Y;

        e.Handled = true;
    }

أعتقد أنني مخطئ هنا ، لكنني علقت حول كيفية الحصول على mousecordination إلى xaml-code من خلال الارتباط بـ DragandDropManager.

شكرًا.

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

المحلول

بالضبط. لا يمكنك ربط خاصية مرفقة ، بطريقة تريدها ، لأنه عليك أن تعرف كائنًا حيث يتم إرفاقه.

كيف نفعل ذلك؟ أرى ثلاثة خيارات (ولكن هناك الكثير).

  1. كلما قمت بسحب استخدام مستمع أحداث الماوس العالمي (الماوس. mousemoveevent) في فئة شريط الحالة المخصصة.
  2. فضح حدث ثابت من DragAndDropManager, ، اشترك فيه في فئة شريط الحالة المخصصة. عندما يحدث السحب ، حدث النار من DragAndDropManager. ولكن كن حذرا مع الأحداث الثابتة. من السهل جدًا تقديم تسرب ذاكرة ...
  3. يتحول DragAndDropManager في المفرد. تنفيذ inotifyvaluechanged في تكنولوجيا المعلومات ، إنشاء خاصية مثيل MousePoint, ، على سبيل المثال. اربطها من statusbar:

    text = "{binding mousepoint.x ، source = {x: static local: dragdropbebehavior.instance}}"

عند حدوث السحب ، قم بتحديث خاصية مثيل ، ورفع الحدث الذي تم تغيير خاصية.

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

هتافات ، أنفاكا

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