Как мне создать приложение WPF, в котором я могу перетаскивать пользовательский элемент управления между окнами?

Я создаю простое приложение Todo List, в котором я хочу иметь несколько списков, плавающих вокруг моего рабочего стола, в которых я могу маркировать задачи и управлять ими.

Соответствующие элементы UIElement в моем приложении:

Window1 (окно) TodoList (пользовательский элемент управления) TodoStackCard (пользовательский элемент управления)

Окно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>

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, когда я могу перетащить файл из приложения в другое приложение, все время видя призрачное представление файла под курсором.

Могу ли я выполнить это исключительно на С# и WPF? Если да/если нет, то как?


person Andrew Myhre    schedule 01.10.2008    source источник


Ответы (2)


Вы должны вызвать DoDragDrop, чтобы инициализировать структуру перетаскивания. Хайме Родригес предоставляет руководство по перетаскиванию здесь

person Michael Brown    schedule 01.10.2008

Как и к сведению, существует большая разница между «перетаскиванием элементов управления» и выполнением того, что делает Проводник, то есть перетаскиванием, особенно с файлами. Это то, что вы захотите найти, как сделать перетаскивание из приложения WPF во что-то другое. Вам понадобится что-то, что создает объект данных (IDaObject) или что-то еще, что они называют в мире WPF, а затем вам нужно вызвать DoDragDrop (опять же, или что-то аналогичное этому в WPF), чтобы начать перетаскивание. Выполнение того, что делает проводник, также возможно, но я подозреваю, что вам не нужно делать некоторые вызовы более низкого уровня, чтобы выполнить это. Взгляните на http://www.codeproject.com/KB/wtl/wtl4mfc10.aspx, чтобы увидеть то, что вам не нужно искать. WPF может на самом деле обернуть все это, но если это не так, вам нужно изучить некоторые вещи, особенно IDragSourceHelper.

person Jim Crafton    schedule 01.10.2008
comment
Инфраструктура WPF Drag and Drop полностью поддерживает возможность перетаскивания файлов Windows. - person Michael Brown; 27.09.2010