C# 如何构建可以在窗口之间拖放用户控件的 WPF 应用程序?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/158372/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I build a WPF application where I can drag and drop a user control between windows?
提问by Andrew Myhre
I'm building a simple Todo List application where I want to be able to have multiple lists floating around my desktop that I can label and manage tasks in.
我正在构建一个简单的待办事项列表应用程序,我希望能够在我的桌面上浮动多个列表,我可以在其中标记和管理任务。
The relevant UIElements in my app are:
我的应用程序中的相关 UIElements 是:
Window1 (Window) TodoList (User Control) TodoStackCard (User Control)
Window1(窗口) TodoList(用户控件) TodoStackCard(用户控件)
Window1 looks like this:
Window1 看起来像这样:
<Window x:Class="TaskHole.App.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:t="clr-namespace:TaskHole.App.Controls"
xmlns:tcc="clr-namespace:TaskHole.CustomControls"
Title="Window1" Width="500" Height="500" Background="Transparent" WindowStyle="None" AllowsTransparency="True" >
<Canvas Name="maincanvas" Width="500" Height="500" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<ResizeGrip SizeChanged="ResizeGrip_SizeChanged" />
<t:TodoList Canvas.Top="0" Canvas.Left="0" MinWidth="30" Width="50" Height="500" x:Name="todoList" TaskHover="todoList_TaskHover" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</Canvas>
</Window>
TodoList looks like this:
TodoList 看起来像这样:
<UserControl x:Class="TaskHole.App.Controls.TodoList"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:t="clr-namespace:TaskHole.App.Controls"
xmlns:tcc="clr-namespace:TaskHole.CustomControls"
Background="Transparent">
<StackPanel VerticalAlignment="Bottom" HorizontalAlignment="Stretch" MinWidth="1" Grid.Row="2" Height="Auto" AllowDrop="True">
<ItemsControl Name="todolist" ItemsSource="{Binding}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Name="stackPanel" VerticalAlignment="Bottom">
</VirtualizingStackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<t:TodoStackCard x:Name="card" TaskHover="card_TaskHover" Orientation="Vertical" VerticalContentAlignment="Top" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</UserControl>
I have multiple instances of these windows, and I want to be able to drag any of the controls between the windows. I have tried using a Thumb control and, while this works, it only allows me to drag a control around the containing canvas.
我有这些窗口的多个实例,我希望能够在窗口之间拖动任何控件。我曾尝试使用 Thumb 控件,虽然这有效,但它只允许我在包含画布周围拖动控件。
How do I mimic the behaviour of, say, Windows Explorer, where I can drag a file outside of the application and onto another application, all the while seeing a ghosted representation of the file under the cursor.
我如何模仿 Windows 资源管理器的行为,在那里我可以将文件拖到应用程序之外并拖到另一个应用程序上,同时在光标下看到文件的幻影表示。
Can I accomplish this purely in C# and WPF? If so/if not, how?
我可以完全在 C# 和 WPF 中完成吗?如果是/如果不是,如何?
采纳答案by Michael Brown
回答by Jim Crafton
Just as an FYI, there's a big difference to "dragging controls" around, and doing what Explorer does, which is Drag and Drop, specifically with files. That's what you'll want to look up, how to do drag and drop from a WPF app to something else. You'll need something that creates a Data Object (IDataObject) or whatever they call that in WPF world, and then you need to call DoDragDrop (again, or whatever is analogous to this in WPF) to start the dragging. Doing what explorer does is also possible, put I suspect you need ot make some lower level calls to accomplish this. Take a look at http://www.codeproject.com/KB/wtl/wtl4mfc10.aspxto see the stuff you need ot look for. WPF may in fact wrap all this up, but if it doesn't these are some of the things you need to look into, especially IDragSourceHelper.
正如仅供参考,“拖动控件”和执行资源管理器所做的事情(拖放)之间存在很大差异,特别是对于文件。这就是您要查找的内容,即如何从 WPF 应用程序拖放到其他应用程序。您将需要创建数据对象 (IDataObject) 或任何他们在 WPF 世界中调用的东西,然后您需要调用 DoDragDrop(再次,或在 WPF 中与此类似的任何内容)以开始拖动。做资源管理器所做的也是可能的,我怀疑您需要进行一些较低级别的调用才能完成此操作。看看http://www.codeproject.com/KB/wtl/wtl4mfc10.aspx看看你需要寻找的东西。WPF 可能实际上将所有这些都打包了,但如果没有,这些是您需要研究的一些事情,