Как создать приложение WPF, где я могу перетаскивать пользовательский элемент управления между окнами? - PullRequest
3 голосов
/ 01 октября 2008

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

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

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? Если так / если нет, то как?

Ответы [ 2 ]

2 голосов
/ 01 октября 2008

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

1 голос
/ 01 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...