Использование LibraryStacks в ScatterView на поверхности - PullRequest
3 голосов
/ 27 октября 2009

Мы пытаемся понять, как перетащить элемент из контейнера LibraryStack в ScatterView, например, как работают примеры приложений просмотра фотографий. В настоящее время элемент просто возвращается обратно в библиотечный стек после того, как мы его перетащим. Мы можем перетаскивать элементы в другие LibraryStacks или LibraryBars.

Вот пример того, что мы пытаемся:

<s:SurfaceWindow x:Class="Idia_seminar.SurfaceWindow1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="http://schemas.microsoft.com/surface/2008"
Title="Idia_seminar"
>
<s:SurfaceWindow.Resources>
<ImageBrush x:Key="WindowBackground" Stretch="None" Opacity="0.6" ImageSource="pack://application:,,,/Resources/WindowBackground.jpg"/>
</s:SurfaceWindow.Resources>

<Grid Background="{StaticResource WindowBackground}" >
    <s:ScatterView Name="scatterView1" AllowDrop="True">
        <s:SurfaceButton Name="surfaceButton1">Button</s:SurfaceButton>
        <s:LibraryStack AllowDrop="True">
            <s:LibraryStackItem Content="hello"></s:LibraryStackItem>
        </s:LibraryStack>
    </s:ScatterView>
</Grid>
</s:SurfaceWindow>

Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 марта 2010

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

Я не уверен, где вы ошиблись, но для того, чтобы перетаскивание работало, должно произойти следующее:

  1. Для цели удаления должно быть установлено значение AllowDrop, равное true
  2. Цель отбрасывания должна быть видна при тестировании попадания (обычно это достигается установкой фона, отличного от нуля - я использую Прозрачный)
  3. Цель удаления должна обработать событие Drop и сделать что-то умное с данными

Вот мой XAML:

<s:ScatterView AllowDrop="True" Background="Transparent" 
        x:Name="scatterView" s:SurfaceDragDrop.Drop="scatterView_Drop">
    <s:SurfaceButton Name="surfaceButton1">Button</s:SurfaceButton>
        <s:LibraryStack>
            <s:LibraryStackItem Content="Hello"></s:LibraryStackItem>
        </s:LibraryStack>
    </s:ScatterView>
</s:ScatterView>

А в коде мы обрабатываем событие Drop

private void scatterView_Drop(object sender, SurfaceDragDropEventArgs e)
{
    Console.WriteLine("Got drop: " + e.Cursor.Data);
    var newItem = new ScatterViewItem();
    // Rely on .ToString() on the data. A real app would do something more clever
    newItem.Content = e.Cursor.Data;
    // Place the new item at the drop location
    newItem.Center = e.Cursor.GetPosition(scatterView);
    // Add it to the scatterview
    scatterView.Items.Add(newItem);
}

Очевидно, что приведенный выше код не обрабатывает перетаскивание элементов обратно на панель библиотеки. Я оставляю это как упражнение для читателя; -)

Следующее руководство по MSDN - это то, что я определенно должен прочитать: http://msdn.microsoft.com/en-us/library/ee804812.aspx

1 голос
/ 15 марта 2010

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

Вам также необходимо использовать SurfaceDragDrop.

SurfaceDragDrop.AddDropHandler (scatterView1, OnCursorDrop); AddHandler (ScatterViewItem.ScatterManipulationStartedEvent, новый ScatterManipulationStartedEventHandler (OnManipulationStarted));

private void OnManipulationStarted(object sender, RoutedEventArgs args)

{ ScatterViewItem svi = args.OriginalSource as ScatterViewItem; if (svi! = null) // && DragDropScatterView.GetAllowDrag (svi)) { svi.BeginDragDrop (svi.DataContext); } }

private void OnCursorDrop(object sender, SurfaceDragDropEventArgs args)

{ SurfaceDragCursor droppingCursor = args.Cursor;

// Add dropping Item that was from another drag source.
if (!scatterView1.Items.Contains(droppingCursor.Data)){
    scatterView1.Items.Add(droppingCursor.Data);

    var svi = scatterView1.ItemContainerGenerator.ContainerFromItem(droppingCursor.Data) as ScatterViewItem;
    if (svi != null){
        svi.Center = droppingCursor.GetPosition(scatterView1);
        svi.Orientation = droppingCursor.GetOrientation(scatterView1);
        svi.Height = droppingCursor.Visual.ActualHeight;
        svi.Width = droppingCursor.Visual.ActualWidth;
        svi.SetRelativeZIndex(RelativeScatterViewZIndex.Topmost);
    }
}

}

Это все в основном из примера в SDK, я не помню, какой из них это к сожалению.

Приветствия

Стиан Фарстад

...