Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中的平滑缩放_C#_Wpf_Zooming_Mousewheel - Fatal编程技术网

C# WPF中的平滑缩放

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

因此,以下是我的问题,我希望我能够以适当的方式提出

简言之:如何在WPF中平滑缩放

详细说明:我正在WPF中编写一个CAD应用程序,当鼠标滚轮事件触发时,我正在重新绘制屏幕的部分

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;