如何在WPF中通过大拇指的X乘法器来调整元素的大小

本文关键字:乘法器 元素 调整 大拇指 WPF | 更新日期: 2023-09-27 17:52:11

我使用Thumb来调整元素的大小。在DragDelta上,我用myElement.Width += e.HorizontalChange。如果我想调整它的大小乘以100呢?

我尝试了myElement.Width += 100 * e.HorizontalChange,但它导致元素"跳舞",当我拖动它。我认为这是因为大的变化导致了鼠标相对于元素位置的错误计算。

怎么做?

我录下了我得到的。我向右调整矩形的大小,你可以看到它是如何闪烁的。视频的重放速度很慢,但仍能看到闪烁。

如何在WPF中通过大拇指的X乘法器来调整元素的大小

看起来Thumb计算的是相对于自身而不是相对于屏幕的HorizontalChange。因此,如果拇指本身在拖动时不能准确地随鼠标移动,那么HorizontalChange的值就不可靠。(另一个不受欢迎的行为的例子)

所以,Thumb在实现自定义移动/调整大小行为时似乎有一点帮助。需要"手动"处理鼠标移动。尽管如此,我们仍然可以使用Thumb的事件作为方便的点来处理鼠标。

    FrameworkElement elementToResize;
    double initialWidth;
    Point initialMouse;
    private void Thumb_DragStarted(object sender, DragStartedEventArgs e)
    {
        initialWidth = elementToResize.ActualWidth;
        initialMouse = Mouse.GetPosition(Window.GetWindow((DependencyObject)sender));
    }
    private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        var horzChange = Mouse.GetPosition(Window.GetWindow((DependencyObject)sender)).X - initialMouse.X;
        elementToResize.Width = initialWidth + 100 * Math.Round(horzChange / 100);
    }

我们需要计算鼠标在屏幕坐标中的位置变化。这在WPF中并不简单。假设在拖动拇指时窗口没有在屏幕上移动,那么获取相对于窗口的鼠标位置将适用,如上面的代码所示。为了提高可靠性,您可以获得实际的鼠标屏幕坐标,但这需要从像素转换为与WPF设备无关的单位。