C# WPF中的平滑缩放
因此,以下是我的问题,我希望我能够以适当的方式提出 简言之:如何在WPF中平滑缩放 详细说明:我正在WPF中编写一个CAD应用程序,当鼠标滚轮事件触发时,我正在重新绘制屏幕的部分C# WPF中的平滑缩放,c#,wpf,zooming,mousewheel,C#,Wpf,Zooming,Mousewheel,因此,以下是我的问题,我希望我能够以适当的方式提出 简言之:如何在WPF中平滑缩放 详细说明:我正在WPF中编写一个CAD应用程序,当鼠标滚轮事件触发时,我正在重新绘制屏幕的部分 private void ModelWindowBorder_MouseWheel(object sender, MouseWheelEventArgs e) { var zoom = e.Delta > 0 ? 0.2 : -0.2; // increase or decrease the
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.
}
实际上,上面的代码是有效的,但我不满足于它,原因有两个:
当我不得不在屏幕上重新绘制大量的视觉效果时,它有点忽略了触发的多个鼠标滚轮事件。因此,如果在一个大卷轴中触发8个鼠标滚轮事件,则只会触发其中的4-5个。这使得缩放速度有点慢
第二个原因可能根本与WPF无关。var zoom=e.增量是否大于0?0.2 : -0.2; 我们应该增加/减少比例的正确方法是什么?在我看来,这似乎不合适。因为当我们被缩小时,当我们放大一步时,差异似乎相当大,但是一旦我们接近图形,增加一步的缩放似乎不多
我想知道您对这两个问题的答案和意见。一个简单的尝试和coelesce mouseweel events就是使用Rx。您可以使用.FromEventPattern方法来使用控制盘事件,并且只关心那些满足增量公差的事件。Rx有点棘手,但可以帮助您获得更简单的代码路径
看到这个答案-一个简单的尝试和coelesce mouseweel事件的方法是使用Rx。您可以使用.FromEventPattern方法来使用控制盘事件,并且只关心那些满足增量公差的事件。Rx有点棘手,但可以帮助您获得更简单的代码路径 请参见此答案-问题1。 你应该考虑e.Delta的值 不是 但是 k是一个双重因素,它是一个装置 此值的有效上限和下限可能来自设备实现或引发事件的其他调用者,因此未定义 但正如你所说的,一个大卷轴的价值会更高 找到k的一个可能的解决方案是获取第一个鼠标滚轮事件,并使用接收到的值作为起点。如果您收到该值的两倍,则两个或多个鼠标滚轮卷轴组合为单个事件。或者随时进行校准,记住最小值和变化系数。由你决定 问题2。 使用乘法,而不是平铺值 组合解决方案如下所示
st.ScaleX *= e.Delta * k;
问题1。
你应该考虑e.Delta的值
不是
但是
k是一个双重因素,它是一个装置
此值的有效上限和下限可能来自设备实现或引发事件的其他调用者,因此未定义
但正如你所说的,一个大卷轴的价值会更高
找到k的一个可能的解决方案是获取第一个鼠标滚轮事件,并使用接收到的值作为起点。如果您收到该值的两倍,则两个或多个鼠标滚轮卷轴组合为单个事件。或者随时进行校准,记住最小值和变化系数。由你决定
问题2。
使用乘法,而不是平铺值
组合解决方案如下所示
st.ScaleX *= e.Delta * k;
除非您向我们展示如何使用zoom变量,否则很难回答第二个问题。@Clemens我实际上是在将它添加到ScaleTransform的ScaleX/ScaleY属性中,就像下面的st.ScaleX+=zoom;你可以改为乘或除一些因子,比如1.2。是的,我想我应该研究一下,它在第一次尝试时给了我意想不到的结果。我在一定程度上实现了这一点@克莱门斯你对第一个问题有什么建议吗?除非你告诉我们你对zoom变量的实际操作,否则很难回答第二个问题。@克莱门斯,我实际上是在将它添加到ScaleTransform的ScaleX/ScaleY属性中,就像这个st.ScaleX+=zoom;你可以改为乘或除一些因子,比如1.2。是的,我想我应该研究一下,它在第一次尝试时给了我意想不到的结果。我在一定程度上实现了这一点@克莱门斯,你对第一期有什么建议吗?谢谢亚当希尔,我现在就调查。谢谢亚当希尔,我现在就调查。谢谢西纳特,我想我看到了希望。你的意思是,对于第一个问题,我应该等待滚动完成,然后根据收到的输入,我应该重新绘制并缩放屏幕?我在这里有点迷糊了。我只需要实现一种方法,使每个大卷轴中鼠标滚轮事件的数量不受重画过程的影响。我只是不知道怎么做。哇,西纳特,这是天才,现在我明白你的意思了!这太神奇了。我希望我能给你我所有的分数!谢谢,谢谢西纳特,我想我看到了希望。你的意思是,对于第一个问题,我应该等待滚动完成,然后根据收到的输入,我应该重新绘制并缩放屏幕?我在这里有点迷路了。我只需要实现一种方法
每个大卷轴中鼠标滚轮事件的数量不受重画过程的影响。我只是不知道怎么做。哇,西纳特,这是天才,现在我明白你的意思了!这太神奇了。我希望我能给你我所有的分数!谢谢
st.ScaleX *= e.Delta * k;