【问题标题】:How to resize element by multiplier of X with Thumb in WPF?如何通过 WPF 中的 Thumb 乘以 X 来调整元素的大小?
【发布时间】:2014-03-24 02:49:33
【问题描述】:

我正在使用Thumb 来调整元素的大小。在DragDelta 我正在做myElement.Width += e.HorizontalChange。如果我想用 100 的倍数调整它的大小怎么办?

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

怎么做?

更新 我记录了我得到的。我将矩形调整到右侧,您可以看到它的大小flickering。视频的播放速度很低,但您仍然可以看到闪烁。实际情况更糟。

【问题讨论】:

  • 你的意思是你需要调整大小不是平滑,而是按100步?
  • @baSSiLL,是的。就像Slider 可以按特定间隔跳跃我希望当我拖动它时它会步进 100,例如
  • 谁能帮我解决这个问题?

标签: c# wpf


【解决方案1】:

看起来Thumb 计算HorizontalChange 相对于自身而不是屏幕。因此,如果在拖动时拇指本身没有随着鼠标准确移动,则HorizontalChange 采用不可靠的值。 (Another example of such unwanted behavior)

所以,在实现自定义移动/调整大小行为时,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 中并不简单。假设在拖动拇指时窗口没有在屏幕上移动,那么获取鼠标相对于窗口的位置将适合,如上面的代码所示。为了更好的可靠性,you can get actual mouse screen coordinates,但这需要从像素转换为 WPF 设备独立单位。

【讨论】:

  • 我看不出它是如何解决问题的。无论如何,它仍然在闪烁。我记录并更新了我的帖子。请看一下
  • 我认为您的困难在于正确计算步进宽度。现在我尝试了Thumb,也看到了这种奇怪的行为。我已经更新了答案。
  • 我对缩放的元素也有类似的问题(如果比例小于 0.5,DragDelta 会发疯)。此解决方案有效,但我必须不断更新 Thumb_DragDelta 中的 initialMouse 位置,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
相关资源
最近更新 更多