0

ユーザーがそれらを注文できるように、リストボックスを使用してコントロール内の要素をドラッグしています。私はそれを達成することができましたが、問題は、ユーザーがリストボックスの外に要素をドラッグアンドドロップしたくないということです。現在、それを行うと、リストボックス項目から要素が削除されます。

これは私のコードです:

    <telerik:RadListBox x:Name="SequenceListBox" x:FieldModifier="public"
                        DockPanel.Dock="Bottom" AllowDrop="True"
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch"
                        ScrollViewer.VerticalScrollBarVisibility="Hidden"
                        ScrollViewer.HorizontalScrollBarVisibility="Auto"
                        Background="Transparent" Margin="30,5,30,5"
                        ItemTemplate="{DynamicResource ListBoxItemTemplate}">
        <telerik:RadListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" VerticalAlignment="Center"/>
            </ItemsPanelTemplate>
        </telerik:RadListBox.ItemsPanel>
        <telerik:RadListBox.DragVisualProvider>
            <telerik:ScreenshotDragVisualProvider />
        </telerik:RadListBox.DragVisualProvider>
        <telerik:RadListBox.DragDropBehavior>
            <telerik:ListBoxDragDropBehavior AllowReorder="True" />
        </telerik:RadListBox.DragDropBehavior>
    </telerik:RadListBox>

        <!-- Sequence ListBox style start -->
    <DataTemplate x:Key="ListBoxItemTemplate">
        <DataTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter Property="LayoutTransform">
                    <Setter.Value>
                        <ScaleTransform ScaleX="1.5" />
                    </Setter.Value>
                </Setter>
            </Trigger>
        </DataTemplate.Triggers>
        <!--<Border BorderThickness="1" BorderBrush="Wheat">-->
        <TextBlock Text="{Binding Path=AttributeName}" MinWidth="30" Foreground="Black"
                   FontSize="12" FontFamily="Segoe UI" ToolTip="Drag and Drop to re-arrange"
                   VerticalAlignment="Center" HorizontalAlignment="Center" />
        <!--</Border>-->
    </DataTemplate>

私の質問はthisに似ていますが、実装方法はまだ明確ではありません。解決策を教えてください。

また、ユーザーがドロップしようとしているときに 2 つの要素間の境界線を (いくつかの色で) 強調表示したいのですが、これを実装する方法がわかりません。

コントロールの外にドロップされたときにリストボックスがアイテムを削除しないようにコードを変更するにはどうすればよいですか?

4

1 に答える 1

1

私はこれを自分でやったことはありませんが、あなたは見ることができますDragDrop.PreviewDragLeave. このイベントは、マウスが要素をコントロールの境界の外にドラッグしているときに発生します。

ドラッグをキャンセルする必要があると判断したら、 で読み取ることができるクラスレベルの変数を設定する必要がありますDragDrop.QueryContinueHandler。残念ながら、eventArgs がサポートしていないため、PreviewDragLeave にいる間はドラッグをキャンセルできません。

bool shouldICancelDrag = false

void listBox1_PreviewDragLeave(object sender, DragEventArgs e)
{
   shouldICancelDrag = true; 
}

private void OnQueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
   if(shouldICancelDrag)
   {
       e.Action = DragAction.Cancel;
       e.Handled = true;
       shouldICancelDrag = false;
   }
}

編集:リストボックスの外にドラッグすることを許可するが、アイテムを外にドロップすることは許可しない場合の代替手段があります(つまり、アイテムをリストボックスに戻す必要があるか、ドラッグイベントがキャンセルされます)。

bool shouldICancelDrag = false

//changed this to be previewDrop on the Window (not the listbox)
void window1_PreviewDrop(object sender, DragEventArgs e)
{
   //check if the item was dropped on something other than the listbox
   //you may need to toy with using e.Source instead (break and see what you're getting via the debugger)
   if (! (e.OriginalSource is ListBox))
     shouldICancelDrag = true; 
}

private void OnQueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
   if(shouldICancelDrag)
   {
       e.Action = DragAction.Cancel;
       e.Handled = true;
       shouldICancelDrag = false;
   }
}
于 2012-11-13T15:10:09.853 に答える