1

Listbox には MainControl と 4 つの PreviewControls があります。リストボックスの項目をクリックすると、mainControl が変更されます (これが発生します)。しかし、listboxitem にドラッグ動作を追加して、listboxitem を previewControls の 1 つにドラッグできるようにしたいと考えています。私はこれを試しましたが、listboxitem をドラッグしようとすると、selectionchanged イベントが常に発生します。

だから私は、MouseLeftDown を実行して listboxitem を移動するときに、ドラッグしてください。Click または MouseLefUp (selectionchanged) が発生すると、MainControl が変更されます。

これを試しましたが、 PreviewMouseLeftButtonDown イベントが再び実行され、他のイベントは実行されません。

private void lstCameras_PreviewMouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
    {
        startPoint = e.GetPosition(null);
        if (!Test) e.Handled = true;
        else
        {
            Test = false;
        }
        Console.WriteLine("lstCameras_PreviewMouseLeftButtonDown_1 Handled = " + e.Handled);
    }

    private void lstCameras_PreviewMouseUp_1(object sender, MouseButtonEventArgs e)
    {
        Console.WriteLine("lstCameras_MouseUp_1");
        if (!Test)
        {
            Test = true;
    lstCameras.RaiseEvent(new MouseButtonEventArgs(Mouse.PrimaryDevice, Environment.TickCount, MouseButton.Left) { RoutedEvent = ListBox.PreviewMouseLeftButtonDownEvent });
        }
        else
        {
            Test = false;
        }
        Console.WriteLine("end lstCameras_MouseUp_1 Test = " + Test);
    }
4

2 に答える 2

1

それが最善の方法かどうかはわかりませんが、うまくいきます。

private object GetDataFromListBox(ListBox source, Point point)
    {
        DependencyObject element = source.InputHitTest(point) as DependencyObject;
        if (element != null)
        {
            object data = DependencyProperty.UnsetValue;
            while (data == DependencyProperty.UnsetValue)
            {
                data = source.ItemContainerGenerator.ItemFromContainer(element);
                if (data == DependencyProperty.UnsetValue)
                {
                    element = (DependencyObject)VisualTreeHelper.GetParent(element);
                }
                if (element == source)
                {
                    return null;
                }
            }
            if (data != DependencyProperty.UnsetValue)
            {
                return data;
            }
        }
        return null;
    }
    private void lstCameras_PreviewMouseMove_1(object sender, MouseEventArgs e)
    {
        Point mousePos = e.GetPosition(null);
        Vector diff = startPoint - mousePos;

        if (e.LeftButton == MouseButtonState.Pressed && this.DataContext != null &&
            (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
            Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
        {
            ListBox parent = (ListBox)sender;
            Item data = (Item)GetDataFromListBox(parent, e.GetPosition(parent));

            if (data != null)
            {
                DataObject dragData = new DataObject(typeof(Item), data);
                DragDrop.DoDragDrop(this, dragData, DragDropEffects.All);
            }
        }
    }

    private void lstCameras_PreviewMouseDown_1(object sender, MouseButtonEventArgs e)
    {
        ListBox parent = (ListBox)sender;
        Item data = (Item)GetDataFromListBox(parent, e.GetPosition(parent));

        if (data != null )
        {
            startPoint = e.GetPosition(null);
            e.Handled = true;
        }
    }

    private void lstCameras_PreviewMouseUp_1(object sender, MouseButtonEventArgs e)
    {
        ListBox parent = (ListBox)sender;
        Item data = (Item)GetDataFromListBox(parent, e.GetPosition(parent));

        if (data != null)
        {
            lstCameras.SelectedItem = data;
        }
    }
于 2013-02-26T14:43:22.840 に答える
0

UserControl にリンクされているイベントを、クリックではなくマウスアップに変更します。そうすれば、フル クリックだけでユーザー コントロールを変更するコードが実行され、ドラッグは妨げられずに続行されます。これは、 MouseUpイベントに関する MSDN へのリンクです:)

于 2013-02-25T16:29:53.270 に答える