【问题标题】:How do I build a WPF application where I can drag and drop a user control between windows?如何构建可以在窗口之间拖放用户控件的 WPF 应用程序?
【发布时间】:2010-09-14 13:48:25
【问题描述】:

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

我的应用中相关的 UIElements 是:

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

我可以纯粹在 C# 和 WPF 中完成此任务吗?如果是/如果不是,怎么办?

【问题讨论】:

    标签: c# wpf windows user-interface


    【解决方案1】:

    您必须调用 DoDragDrop 来初始化拖放框架。 Jaime Rodriguez 提供拖放指南here

    【讨论】:

      【解决方案2】:

      仅供参考,“拖动控件”与执行 Explorer 所做的操作(即拖放,尤其是文件)之间存在很大差异。这就是您要查找的内容,如何从 WPF 应用程序拖放到其他内容。您将需要创建数据对象 (IDataObject) 或 WPF 世界中他们称之为的任何东西,然后您需要调用 DoDragDrop(再次,或在 WPF 中与此类似的任何东西)来开始拖动。做 explorer 做的事情也是可能的,我怀疑你需要做一些较低级别的调用来完成这个。看看http://www.codeproject.com/KB/wtl/wtl4mfc10.aspx 看看你需要寻找的东西。 WPF 实际上可能包含所有这些,但如果不是,这些是您需要研究的一些内容,尤其是 IDragSourceHelper。

      【讨论】:

      • WPF 拖放框架完全支持 Windows 文件拖放体验。
      猜你喜欢
      • 2018-12-03
      • 2023-03-04
      • 2011-04-11
      • 2012-12-04
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      相关资源
      最近更新 更多