عرض MousePoint أثناء القيام بالسحب والإسقاط في WPF
-
20-09-2019 - |
سؤال
انا استخدم 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.
شكرًا.
المحلول
بالضبط. لا يمكنك ربط خاصية مرفقة ، بطريقة تريدها ، لأنه عليك أن تعرف كائنًا حيث يتم إرفاقه.
كيف نفعل ذلك؟ أرى ثلاثة خيارات (ولكن هناك الكثير).
- كلما قمت بسحب استخدام مستمع أحداث الماوس العالمي (الماوس. mousemoveevent) في فئة شريط الحالة المخصصة.
- فضح حدث ثابت من
DragAndDropManager
, ، اشترك فيه في فئة شريط الحالة المخصصة. عندما يحدث السحب ، حدث النار منDragAndDropManager
. ولكن كن حذرا مع الأحداث الثابتة. من السهل جدًا تقديم تسرب ذاكرة ... يتحول
DragAndDropManager
في المفرد. تنفيذ inotifyvaluechanged في تكنولوجيا المعلومات ، إنشاء خاصية مثيلMousePoint
, ، على سبيل المثال. اربطها من statusbar:text = "{binding mousepoint.x ، source = {x: static local: dragdropbebehavior.instance}}"
عند حدوث السحب ، قم بتحديث خاصية مثيل ، ورفع الحدث الذي تم تغيير خاصية.
أتمنى أن يساعدك هذا،
هتافات ، أنفاكا