マウスダウンが特定のコントロール上にある場合にリストボックスアイテムがドラッグされないようにする方法

ハンク

リストボックスアイテムのドラッグアンドドロップ操作についてアドバイスをお願いします。以下に示すように、各アイテムにはComboBox、TextBox、CheckBox、およびButtonがあります。

ここに画像の説明を入力してください

ドラッグアンドドロップを使用してこれらを並べ替えましたが、ほぼ正しく機能しています。

主な問題は、上記のコントロールの1つでPreviewMouseLeftButtonDownイベントとPreviewMouseMoveイベントが発生したときに、アイテムのドラッグ操作が発生していることです。

私の質問は、コントロールの1つがクリックされたときにこのドラッグが発生するのを防ぐための良い方法は何ですか?

XAML:

<DataTemplate DataType="{x:Type helpers:Filter}">
    <Border>
        <Border>
            <Grid>
                <ComboBox />
                <TextBox />
                <CheckBox />
                <Button />
            </Grid>
        </Border>
    </Border>
</DataTemplate>

<ListBox x:Name="FilterList"
         ItemsSource="{Binding Filters}"
         helpers:DragDropHelper.IsDragSource="true" 
         helpers:DragDropHelper.IsDropTarget="true" />

C#:

public static readonly DependencyProperty IsDragSourceProperty =
    DependencyProperty.RegisterAttached("IsDragSource", typeof(bool), typeof(DragDropHelper), new UIPropertyMetadata(false, IsDragSourceChanged));


private void DragSource_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    this.sourceItemsControl = (ItemsControl)sender;
    Visual visual = e.OriginalSource as Visual;

    this.topWindow = Window.GetWindow(this.sourceItemsControl);
    this.initialMousePosition = e.GetPosition(this.topWindow);

    this.sourceItemContainer = sourceItemsControl.ContainerFromElement(visual) as FrameworkElement;

    if (this.sourceItemContainer != null)
    {
        this.draggedData = this.sourceItemContainer.DataContext;
    }
}

// Drag = mouse down + move by a certain amount
private void DragSource_PreviewMouseMove(object sender, MouseEventArgs e)
{
    if (this.draggedData != null)
    {
        // Only drag when user moved the mouse by a reasonable amount.
        if (Utilities.IsMovementBigEnough(this.initialMousePosition, e.GetPosition(this.topWindow)))
        {
            this.initialMouseOffset = this.initialMousePosition - this.sourceItemContainer.TranslatePoint(new Point(0, 0), this.topWindow);

            DataObject data = new DataObject(this.format.Name, this.draggedData);

            // Adding events to the window to make sure dragged adorner comes up when mouse is not over a drop target.
            bool previousAllowDrop = this.topWindow.AllowDrop;
            this.topWindow.AllowDrop = true;
            this.topWindow.DragEnter += TopWindow_DragEnter;
            this.topWindow.DragOver += TopWindow_DragOver;
            this.topWindow.DragLeave += TopWindow_DragLeave;

            DragDropEffects effects = DragDrop.DoDragDrop((DependencyObject)sender, data, DragDropEffects.Move);

            RemoveDraggedAdorner();

            this.topWindow.AllowDrop = previousAllowDrop;
            this.topWindow.DragEnter -= TopWindow_DragEnter;
            this.topWindow.DragOver -= TopWindow_DragOver;
            this.topWindow.DragLeave -= TopWindow_DragLeave;

            this.draggedData = null;
        }
    }
}
シェリダン

私はPreviewMouseDownイベントハンドラーでドラッグアンドドロッププロパティを初期化する傾向がありますが、ユーザーがドラッグしていない可能性があるため、そのハンドラーで他​​のドラッグアンドドロップ操作を実行することは賢明ではありません...クリックしただけかもしれません。

代わりに、PreviewMouseMoveイベントを処理してドラッグアンドドロップ操作を開始することをお勧めします。簡単な例を次に示します。

private void DragSourcePreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    isMouseDown = true;
}

private void DragSourcePreviewMouseMove(object sender, MouseEventArgs e)
{
    if (isMouseDown && IsConfirmedDrag(e.GetPosition(sender as ListBox)))
    {
        isMouseDown = false;
        ...
        DragDrop.DoDragDrop(dragSource, data, DragDropEffects);
    }
}

PreviewMouseMoveどのUI要素がクリックされたかを確認し、ドラッグアンドドロップ操作を開始するかどうかを決定できるのは、イベントハンドラーです。次のようなものを試してください。

private void DragSourcePreviewMouseMove(object sender, MouseEventArgs e)
{
    ListBox dragSourceControl = (ListBox)sender;
    HitTestResult result = VisualTreeHelper.HitTest(dragSourceControl, 
        Mouse.GetPosition(dragSourceControl));
    UIElement draggedUIElement = result.VisualHit.GetParentOfType<ListBoxItem>();
    bool isViable = AddYourViabilityConditionHere(draggedUIElement);
    if (isMouseDown && IsConfirmedDrag(e.GetPosition(sender as ListBox)) && isViable)
    {
        isMouseDown = false;
        ...
        DragDrop.DoDragDrop(dragSource, data, DragDropEffects);
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

aspxページでチェックボックスがオンになっている場合、テキストボックス、テキストエリア、ドロップダウンなどの特定のコントロールを無効にします

分類Dev

モデルバインディングに特定のドロップダウン値が選択されている場合、ドロップダウンリストアイテムの代わりにテキスト入力値を返すにはどうすればよいですか?

分類Dev

特定のカテゴリが選択されている場合、チェックアウトページのカスタムドロップダウンフィールドを非表示にする方法はありますか?

分類Dev

ドロップダウンスタイルが.NETのDropDownListである場合、コンボボックスのテキストボックス部分の背景色を設定するにはどうすればよいですか?

分類Dev

含まれているテキストが実行時に認識されない場合に、コード化されたUIでチェックリストボックスのアイテムコントロールを選択する

分類Dev

(ブートストラップ)-クリックされたアイテムを反映するようにドロップダウンボタンのテキストを変更すると、キャレットが削除されます

分類Dev

オペレーティングシステムがインストールされていない場合、ハードウェアが64ビット対応であるとどのように判断しますか?

分類Dev

内部にコンボボックスがあるリストウィジェットアイテムをドラッグアンドドロップします

分類Dev

その行のチェックボックスがチェックされている場合、「OncheckedChange」イベントでグリッドビュー内にあるドロップダウンリストをバインドします

分類Dev

剣道データグリッドがExcellダウンロードダイアログにエクスポートされないようにする

分類Dev

選択したアイテムのIDが表示されない2つのドロップダウンを選択します。コントローラーバインドにアクセスするにはどうすればよいですか。

分類Dev

Typescript、ボタンがクリックされたときにブートストラップドロップダウンが閉じないようにする

分類Dev

ユーザーが特定のドロップダウンリストアイテムをクリックした場合、パネルに表示されません

分類Dev

異なる幅のアイコンが前にあるために位置合わせされていないブートストラップドロップダウンリストの要素を垂直方向に位置合わせするにはどうすればよいですか?

分類Dev

Androidで、特定のBluetoothデバイスが接続されている場合にマイクをアクティブにするバックグラウンドサービスを実行するにはどうすればよいですか?

分類Dev

ファイル名に「.xml」サフィックスがない場合、Chromeがブラウザに表示するのではなく、ローカルホスト上のgatsbyから提供されたxmlファイルをダウンロード/保存しようとするのはなぜですか?

分類Dev

プロンプトボックスが空の場合、またはキャンセルがヒットした場合に成績が入力されていないかどうかをプログラムに検出させるために、このコードを編集するにはどうすればよいですか?

分類Dev

一部の選択チェックボックスが存在しない場合にドロップダウンアイテムを無効にする方法

分類Dev

Windows 10システム状態バックアップwbadminコマンドは、「指定されたバックアップストレージの場所に別のボリュームにシャドウコピーストレージがあります。」というエラーが表示されます。

分類Dev

ドロップダウンボックスリストなどのすべてのデータを送信しないためにモデルステートが無効な場合にビューモデルを再入力する必要がある

分類Dev

HtmlUnitDriverとHtmlUnitヘッドレスブラウザで異なる方法でレンダリングされた[カテゴリの選択(US)]の下にあるアイテムのリストを作成するにはどうすればよいですか?

分類Dev

ドロップダウンリストに特定のリスト内のすべてのアイテムがあるかどうかを確認する方法

分類Dev

モバイルデザインが非常に異なる場合(別名、グリッドレイアウトを利用できない場合)、コンポーネントのデスクトップレイアウトとモバイルレイアウトをどのように処理しますか?

分類Dev

WIN32 API Cプログラム:コンボボックスに空のリストがあるか、CB_ADDSTRINGが入力されているにもかかわらずドロップダウンしない

分類Dev

動的ドロップダウンはアイテムを正しくリストします。フォームに送信されたドロップダウンフィールドがnullになる場合。

分類Dev

Googleタグマネージャがインストールされている場合、他のツールのスクリプトがブラウザにダウンロードされています

分類Dev

アイテムの高さが動的な場合、デバイスの向きに基づいて動的なフラッターグリッドレイアウトを作成するにはどうすればよいですか?

分類Dev

アイテムの高さが動的な場合、デバイスの向きに基づいて動的なフラッターグリッドレイアウトを作成するにはどうすればよいですか?

分類Dev

コマンドを再起動せずに、実行中のプロセス出力がリダイレクトされている新しいファイルにスワップアウトするにはどうすればよいですか?

Related 関連記事

  1. 1

    aspxページでチェックボックスがオンになっている場合、テキストボックス、テキストエリア、ドロップダウンなどの特定のコントロールを無効にします

  2. 2

    モデルバインディングに特定のドロップダウン値が選択されている場合、ドロップダウンリストアイテムの代わりにテキスト入力値を返すにはどうすればよいですか?

  3. 3

    特定のカテゴリが選択されている場合、チェックアウトページのカスタムドロップダウンフィールドを非表示にする方法はありますか?

  4. 4

    ドロップダウンスタイルが.NETのDropDownListである場合、コンボボックスのテキストボックス部分の背景色を設定するにはどうすればよいですか?

  5. 5

    含まれているテキストが実行時に認識されない場合に、コード化されたUIでチェックリストボックスのアイテムコントロールを選択する

  6. 6

    (ブートストラップ)-クリックされたアイテムを反映するようにドロップダウンボタンのテキストを変更すると、キャレットが削除されます

  7. 7

    オペレーティングシステムがインストールされていない場合、ハードウェアが64ビット対応であるとどのように判断しますか?

  8. 8

    内部にコンボボックスがあるリストウィジェットアイテムをドラッグアンドドロップします

  9. 9

    その行のチェックボックスがチェックされている場合、「OncheckedChange」イベントでグリッドビュー内にあるドロップダウンリストをバインドします

  10. 10

    剣道データグリッドがExcellダウンロードダイアログにエクスポートされないようにする

  11. 11

    選択したアイテムのIDが表示されない2つのドロップダウンを選択します。コントローラーバインドにアクセスするにはどうすればよいですか。

  12. 12

    Typescript、ボタンがクリックされたときにブートストラップドロップダウンが閉じないようにする

  13. 13

    ユーザーが特定のドロップダウンリストアイテムをクリックした場合、パネルに表示されません

  14. 14

    異なる幅のアイコンが前にあるために位置合わせされていないブートストラップドロップダウンリストの要素を垂直方向に位置合わせするにはどうすればよいですか?

  15. 15

    Androidで、特定のBluetoothデバイスが接続されている場合にマイクをアクティブにするバックグラウンドサービスを実行するにはどうすればよいですか?

  16. 16

    ファイル名に「.xml」サフィックスがない場合、Chromeがブラウザに表示するのではなく、ローカルホスト上のgatsbyから提供されたxmlファイルをダウンロード/保存しようとするのはなぜですか?

  17. 17

    プロンプトボックスが空の場合、またはキャンセルがヒットした場合に成績が入力されていないかどうかをプログラムに検出させるために、このコードを編集するにはどうすればよいですか?

  18. 18

    一部の選択チェックボックスが存在しない場合にドロップダウンアイテムを無効にする方法

  19. 19

    Windows 10システム状態バックアップwbadminコマンドは、「指定されたバックアップストレージの場所に別のボリュームにシャドウコピーストレージがあります。」というエラーが表示されます。

  20. 20

    ドロップダウンボックスリストなどのすべてのデータを送信しないためにモデルステートが無効な場合にビューモデルを再入力する必要がある

  21. 21

    HtmlUnitDriverとHtmlUnitヘッドレスブラウザで異なる方法でレンダリングされた[カテゴリの選択(US)]の下にあるアイテムのリストを作成するにはどうすればよいですか?

  22. 22

    ドロップダウンリストに特定のリスト内のすべてのアイテムがあるかどうかを確認する方法

  23. 23

    モバイルデザインが非常に異なる場合(別名、グリッドレイアウトを利用できない場合)、コンポーネントのデスクトップレイアウトとモバイルレイアウトをどのように処理しますか?

  24. 24

    WIN32 API Cプログラム:コンボボックスに空のリストがあるか、CB_ADDSTRINGが入力されているにもかかわらずドロップダウンしない

  25. 25

    動的ドロップダウンはアイテムを正しくリストします。フォームに送信されたドロップダウンフィールドがnullになる場合。

  26. 26

    Googleタグマネージャがインストールされている場合、他のツールのスクリプトがブラウザにダウンロードされています

  27. 27

    アイテムの高さが動的な場合、デバイスの向きに基づいて動的なフラッターグリッドレイアウトを作成するにはどうすればよいですか?

  28. 28

    アイテムの高さが動的な場合、デバイスの向きに基づいて動的なフラッターグリッドレイアウトを作成するにはどうすればよいですか?

  29. 29

    コマンドを再起動せずに、実行中のプロセス出力がリダイレクトされている新しいファイルにスワップアウトするにはどうすればよいですか?

ホットタグ

アーカイブ