如何构建WPF应用程序,在其中可以在窗口之间拖放用户控件?
时间:2020-03-06 14:59:00 来源:igfitidea点击:
我正在构建一个简单的"待办事项列表"应用程序,希望在其中可以在桌面上浮动多个列表,以便在其中添加标签和管理任务。
我的应用程序中的相关UIElement是:
Window1(窗口)
TodoList(用户控制)
TodoStackCard(用户控制)
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看起来像这样:
<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>
我有这些窗口的多个实例,并且我希望能够在窗口之间拖动任何控件。我尝试使用一个Thumb控件,虽然可以正常工作,但它只允许我在包含画布的周围拖动控件。
我如何模仿Windows资源管理器的行为,在该行为下,我可以将文件拖到应用程序外部并拖到另一个应用程序上,同时还能在光标下看到文件的重影表示。
我可以仅在Cand WPF中完成此操作吗?如果是/否,如何?
解决方案
我们必须调用DoDragDrop来初始化拖放框架。 Jaime Rodriguez在此处提供了拖放指南
就像FYI一样,"拖曳控件"和执行Explorer的工作也有很大的不同,这就是拖放,尤其是对文件。这就是我们要查找的内容,以及如何从WPF应用程序拖放到其他应用程序。我们将需要一些可以创建数据对象(IDataObject)的东西,或者在WPF世界中它们被称为的任何东西,然后我们需要调用DoDragDrop(再次,或者与WPF中类似的东西)来开始拖动。也可以执行资源管理器中的操作,我怀疑我们需要进行一些较低级别的调用才能完成此操作。看一下http://www.codeproject.com/KB/wtl/wtl4mfc10.aspx,以查看需要查找的内容。 WPF实际上可以将所有这些内容总结起来,但是如果没有,那么我们需要研究其中的一些内容,尤其是IDragSourceHelper。