c# - WPF 中的平滑缩放

标签 c# wpf zooming mousewheel

所以这是我的问题,我希望我能够以适当的方式提出。

简述如何在WPF中平滑缩放?

详细信息:我正在用 WPF 编写一个 CAD 应用程序,当 MouseWheel 事件被触发时,我将重绘部分屏幕。

private void ModelWindowBorder_MouseWheel(object sender, MouseWheelEventArgs e)
{
       var zoom = e.Delta > 0 ? 0.2 : -0.2;
    // increase or decrease the scale by *zoom*
    // Redraw Screen
    // Apply TransformScale and etc.
}

实际上上面的代码可以工作,但我不满意,原因有二:

  1. 当我必须在屏幕上重绘大量视觉效果时,它有点错过了触发的多个 MouseWheel 事件。因此,如果要在 一个大滚动 中触发 8 个 MouseWheel 事件,则只会触发其中的 4-5 个。这使得缩放有点慢。

  2. 第二个原因可能与 WPF 根本无关。 var zoom = e.Delta > 0 吗? 0.2 : -0.2; 我们应该增加/减少比例的正确方法是什么?对我来说似乎不合适。因为当我们缩小时,当我们放大一级时差异似乎很大,但是一旦我们接近绘图,放大一级似乎并不多。

我想知道您对这两个问题的回答和评论。

最佳答案

问题1.

您应该考虑 e.Delta

不是

var zoom = e.Delta > 0 ? 0.2 : -0.2;

但是

var zoom = e.Delta * k;

k 是一个double 因子,它是device specific

The effective upper and lower ranges of this value potentially come from device implementations or other callers that raised the event, and are therefore not defined

但正如您所说,它的值(value)会更高 一个大卷轴

找到 k 的一个可能的解决方案是获取第一个 MouseWheel 事件并使用接收到的值作为起点。如果您收到该值的两倍,则两个或多个鼠标滚轮滚动被合并为一个事件。或者一直进行校准,记住最小值和它的变化因子。由你决定。

问题2.

使用乘法而不是加法。

组合后的解决方案如下所示

st.ScaleX *= e.Delta * k;

关于c# - WPF 中的平滑缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22967337/

相关文章:

c# - 保存调用栈

c++ - OpenGL 谷歌地图样式 2D 相机/缩放到鼠标光标

objective-c - 在 UIScrollview 的 subview 上添加 UIPinchGestureRecognizer

c# - 注销后如何防止浏览器后退按钮?

c# - 是否有可能知道 wpf 中的样式中有哪些 setter 可用?

c# - 从我的 stringbuilder 中删除一个字符

wpf - 具有 WPF 应用程序的 Application Insights Enterprise 是否将每个用户电脑视为一个节点

.net - 如何获得 ListView GridViewColumn 来填充网格中的剩余空间?

c# - 将图像源绑定(bind)到 BitmapSource 时,图像保持空白

iphone - 如何在 UIWebView 中启用放大/缩小选项?