在wpf用户控件中拖放

时间:2012-08-09 15:17:43

标签: wpf mvvm user-controls

我在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架构

2 个答案:

答案 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中使用的方法的示例,用于具有可以执行拖放某些控件的内容区域。背后的想法也适用于在两个列表框之间拖放数据,这些列表框可能位于同一内容区域。

希望这有帮助。