标签:控件 MouseWheel 缩放 Windows AssociatedObject transform System WPF
对控件进行缩放
控件的缩放属于 Transform
, 而对于需要以鼠标位置为中心进行缩放则为 MatrixTransform
, 为保证 MVVM
的一致性,采用 System.Windows.Interactivity
中的 Behavior
实现, 下面为实现控件缩放的方法.
ZoomOnMouseWheel.cs
using System.Windows;
using System.Windows.Input;
using System.Windows.Interactivity;
using System.Windows.Media;
namespace Demo.Utils
{
public class ZoomOnMouseWheel : Behavior<FrameworkElement>
{
public Key? ModifierKey { get; set; } = null;
public TransformMode TranformMode { get; set; } = TransformMode.Render;
private Transform _transform;
protected override void OnAttached()
{
if (TranformMode == TransformMode.Render)
{
_transform = AssociatedObject.RenderTransform = new MatrixTransform();
}
else
{
_transform = AssociatedObject.LayoutTransform = new MatrixTransform();
}
AssociatedObject.MouseWheel += AssociatedObject_MouseWheel;
}
protected override void OnDetaching()
{
AssociatedObject.MouseWheel -= AssociatedObject_MouseWheel;
}
private void AssociatedObject_MouseWheel(object sender, MouseWheelEventArgs e)
{
if ((!ModifierKey.HasValue || !Keyboard.IsKeyDown(ModifierKey.Value)) && ModifierKey.HasValue)
{
return;
}
if (!(_transform is MatrixTransform transform))
{
return;
}
var pos1 = e.GetPosition(AssociatedObject);
var scale = e.Delta > 0 ? 1.1 : 1 / 1.1;
var mat = transform.Matrix;
mat.ScaleAt(scale, scale, pos1.X, pos1.Y);
transform.Matrix = mat;
e.Handled = true;
}
}
public enum TransformMode
{
Layout,
Render,
}
}
View.xaml
<UserControl ...
xmlns:interactivity="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:Demo.Utils">
<Canvas>
<interactivity:Interaction.Behaviors>
<local:ZoomOnMouseWheel ModifierKey="LeftCtrl" TransformMode="Layout">
</interactivity:Interaction.Behaviors>
</Canvas>
</UserControl>
标签:控件,MouseWheel,缩放,Windows,AssociatedObject,transform,System,WPF 来源: https://blog.csdn.net/qq_39395589/article/details/113886708
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。