我在wpf中创建了一个拖放控件,用于在两个列表框之间拖放数据,这些列表框作为一个魅力,直到我将它移动到另一个项目。
区别在于它最初是一个wpf窗口,并使用窗口对象来获取鼠标位置和控件的位置。
this.topWindow = Window.GetWindow(this.sourceItemsControl); //Source items control is instance of ItemsControl
bool previousAllowDrop = this.topWindow.AllowDrop;
this.topWindow.AllowDrop = true;
现在我不得不将其更改为用户控件,因为它是一个更大的项目的一部分,它是一个Windows窗体项目,并且视图从主项目链接为智能部件。所以现在Window对象为null。
我为用户控制寻找了类似的功能,却找不到它。我错过了什么?我知道应该有一些东西......我们会感激任何帮助。
附: :我正在使用MVVM架构
答案 0 :(得分:1)
找到了使用递归找到基本用户控件的方法,感谢ekholm的提升......
public static UserControl FindParentControl(DependencyObject child)
{
DependencyObject parent = VisualTreeHelper.GetParent(child);
//CHeck if this is the end of the tree
if (parent == null) return null;
UserControl parentControl = parent as UserControl;
if (parentControl != null)
{
return parentControl;
}
else
{
//use recursion until it reaches a Window
return FindParentControl(parent);
}
}
现在,这个基本用户控件可用于查找坐标(引用)以及设置其他属性,如AllowDrop, DragEnter, DragOver
等。
答案 1 :(得分:-1)
如果您需要MVVM,则可以检查此解决方案: 在.xaml文件中添加:
<ContentControl Content="{Binding Content, Mode=TwoWay}" AllowDrop="True" Name="myDesignerContentControl" />
在ViewModel中添加以下内容:
private Panel _content;
public Panel Content {
get { return _content; }
set {
_content = value;
if (_content != null) {
RegisterDragAndDrop();
}
base.RaisePropertyChanged("Content");
}
}
private void RegisterDragAndDrop() {
Content.Drop += OnDrop;
Content.PreviewMouseLeftButtonDown += OnMouseLeftButtonDown;
Content.PreviewDragOver += OnDragOver;
}
private void OnDesignerDrop(object sender, DragEventArgs e) {
//some custom logic handling
}
private void OnDesignerMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
var control = (FrameworkElement)e.Source;
//some custom logic handling for doing drag & drop
}
private void OnDesignerDragOver(object sender, DragEventArgs e) {
//some custom logic handling for doing drag over
}
这个想法是你应该使用控件而不是鼠标位置,这将是更简单和逻辑的方法。上面的代码是一个在MVVM中使用的方法的示例,用于具有可以执行拖放某些控件的内容区域。背后的想法也适用于在两个列表框之间拖放数据,这些列表框可能位于同一内容区域。
希望这有帮助。