0

私は Telerik グリッド ビューを持っています。ヘッダーを右クリックすると、列のリストを含む ListBox が表示されます。

列を表示するかどうかを設定できるように、アイテム テンプレートを再定義してチェック ボックスを表示します。列をドラッグ アンド ドロップして並べ替えることもできます。

ポップアップを作成する方法は次のとおりです。

var view = new ColumnsOrderer.ColumnsOrderer
            {
                DataContext = new ColumnsOrderer.ViewModelColumnsOrderer(Columns)
            };

var codePopup = new Popup
                    {
                        Child = view,
                        MaxHeight = 400,
                        StaysOpen = false,
                        Placement = PlacementMode.Mouse
                    };
codePopup.IsOpen = true;

すべてが正しく機能しているように見えますが、そうではありません。列を表示または非表示に設定してからポップアップの外側をクリックすると、正しく閉じます。

アイテムをドラッグして並べ替えると、ポップアップがフォーカスを失ったように見え、ポップアップの外をクリックしても閉じません。ポップアップ内のリストボックスをクリックして戻す必要があり、外側をクリックして閉じます。

これが私のドラッグ/ドロップイベントです:

public ColumnsOrderer()
{
    InitializeComponent();
    InitialiazeListBoxDragDrop();
}

private void InitialiazeListBoxDragDrop()
{
    var itemContainerStyle = new Style(typeof(ListBoxItem));

    itemContainerStyle.Setters.Add(new Setter(AllowDropProperty, true));
    itemContainerStyle.Setters.Add(new EventSetter(PreviewMouseMoveEvent, new MouseEventHandler(OnMouseMove)));
    itemContainerStyle.Setters.Add(new EventSetter(DropEvent, new DragEventHandler(OnDrop)));

    listColumns.ItemContainerStyle = itemContainerStyle;
}

void OnMouseMove(object sender, MouseEventArgs e)
{
    if (e.OriginalSource is CheckBox || e.LeftButton == MouseButtonState.Released)
        return;

    if (sender is ListBoxItem)
    {
        var draggedItem = sender as ListBoxItem;
        draggedItem.IsSelected = true;

        DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);
    }
}

void OnDrop(object sender, DragEventArgs e)
{
    if (!(sender is ListBoxItem))
        return;
}

興味深いことに、OnDrop ハンドラーを削除すると、問題はなくなります。フォーカスをポップアップに戻すために多くの方法を試しましたが、うまくいきません。

誰かがそれについて私を助けることができますか?

4

1 に答える 1

0

Popupドラッグ アンド ドロップ操作の後で、コントロールの焦点を合わせ直してみてはどうでしょうか。

void OnDrop(object sender, DragEventArgs e)
{
    if (!(sender is ListBoxItem))
        return;
    codePopup.Focus();
}
于 2013-08-23T13:13:39.183 に答える