如何生成可在窗口之间拖放用户控件的 WPF 应用程序

本文关键字:控件 用户 WPF 应用程序 拖放 之间 何生成 窗口 | 更新日期: 2023-09-27 17:47:22

我正在构建一个简单的待办事项列表应用程序,我希望能够在桌面上浮动多个列表,我可以在其中标记和管理任务。

我的应用程序中的相关 UIElements 包括:

窗口

1(窗口)待办事项列表(用户控制)TodoStackCard (User Control)

窗口 1 如下所示:

<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>

待办事项列表如下所示:

<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资源管理器的行为,我可以将文件拖到应用程序之外并拖到另一个应用程序上,同时在光标下看到文件的幻影表示形式。

我可以纯粹在 C# 和 WPF 中完成此操作吗?如果是这样/如果不是,如何?

如何生成可在窗口之间拖放用户控件的 WPF 应用程序

您必须调用 DoDragDrop 来初始化拖放框架。海梅·罗德里格斯(Jaime Rodriguez)在此处提供了拖放指南

仅供参考,"拖动控件"和执行资源管理器所做的操作(即拖放)有很大的区别,特别是文件。这就是你想要查找的内容,如何从 WPF 应用拖放到其他内容。你需要一些东西来创建数据对象(IDataObject)或他们在WPF世界中所说的任何东西,然后你需要调用DoDragDrop(再次调用,或者WPF中与此类似的任何内容)来开始拖动。做资源管理器做的事情也是可能的,我怀疑你需要做一些较低级别的调用来完成这个。看看 http://www.codeproject.com/KB/wtl/wtl4mfc10.aspx,看看你需要寻找的东西。WPF 实际上可能会总结所有这些,但如果不是,这些是您需要研究的一些内容,尤其是 IDragSourceHelper。