1

我在 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 对象为空。

我为用户控制寻找类似的功能,但找不到它。我错过了什么?我知道应该有一些东西..会很感激任何帮助..

PS:我使用的是 MVVM 架构

4

2 回答 2

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

于 2012-08-15T20:20:28.553 回答
-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 中使用的方法示例,用于拥有一个内容区域,您可以在该内容区域上执行某些控件的拖放操作。背后的想法也适用于在两个列表框之间拖放数据,您可能在同一内容区域上。

希望这可以帮助。

于 2012-08-10T13:01:43.620 回答