所以这是我的问题,我希望我能够以适当的方式提出。
简述如何在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.
}
实际上上面的代码可以工作,但我不满意,原因有二:
当我必须在屏幕上重绘大量视觉效果时,它有点错过了触发的多个
MouseWheel
事件。因此,如果要在 一个大滚动 中触发 8 个 MouseWheel 事件,则只会触发其中的 4-5 个。这使得缩放有点慢。第二个原因可能与 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/