public class ScaleBehavior : Behavior<FrameworkElement>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.MouseWheel += AssociatedObject_MouseWheel;
}
private void AssociatedObject_MouseWheel(object sender,
System.Windows.Input.MouseWheelEventArgs e)
{
//首次滚动时,判断RenderTransform的类型是否为ScaleTransform
if (!(AssociatedObject.RenderTransform is ScaleTransform))
{
AssociatedObject.RenderTransform = new ScaleTransform()
{
CenterX = AssociatedObject.ActualWidth / 2,
CenterY = AssociatedObject.ActualHeight / 2,
};
}
var transform = AssociatedObject.RenderTransform as ScaleTransform;
double scale = e.Delta * 0.001;
transform.ScaleX += scale;
transform.ScaleY += scale;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.MouseWheel -= AssociatedObject_MouseWheel;
}
}
public class ScaleBehavior : Behavior<FrameworkElement>
{
// 当行为附加到元素时注册鼠标滚轮事件
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.MouseWheel += AssociatedObject_MouseWheel;
// [!] 未校验父容器尺寸变化(ActualWidth/Height可能动态更新)
}
// 鼠标滚轮事件处理:动态缩放元素
private void AssociatedObject_MouseWheel(object sender, MouseWheelEventArgs e)
{
// 首次滚动时强制创建缩放变换(可能覆盖原有变换链)
if (!(AssociatedObject.RenderTransform is ScaleTransform))
{
AssociatedObject.RenderTransform = new ScaleTransform()
{
// 设置缩放中心为元素几何中心
CenterX = AssociatedObject.ActualWidth / 2, // [!] 未监听ActualWidth变化
CenterY = AssociatedObject.ActualHeight / 2
};
}
var transform = AssociatedObject.RenderTransform as ScaleTransform;
// 计算缩放增量(Delta=120为滚轮单位,固定0.001系数)
double scale = e.Delta * 0.001; // [!] 未提供缩放速度可配置化
// 同步修改X/Y轴缩放比例(可能导致非等比缩放)
transform.ScaleX += scale; // [!] 无最小/最大值限制
transform.ScaleY += scale;
}
// 行为分离时解除事件绑定
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.MouseWheel -= AssociatedObject_MouseWheel;
// [!] 未还原RenderTransform原始状态
}
}
graph TD
A[行为附加到元素] --> B[注册MouseWheel事件]
B --> C{用户滚动鼠标滚轮}
C -->|首次滚动| D[创建ScaleTransform并设置中心点]
C -->|非首次| E[获取现有ScaleTransform]
D --> F[计算缩放增量]
E --> F
F --> G[更新ScaleX/ScaleY值]
H[行为分离] --> I[解除事件绑定]
classDef risk fill:#FFF3E0,stroke:#FFA726;
class D,G risk
style F stroke:#4CAF50,stroke-width:2px
2. 增强版代码示例
// 支持动画与变换组合的改进实现
public class EnhancedScaleBehavior : Behavior<FrameworkElement>
{
protected override void OnAttached()
{
// 初始化组合变换(保留原有变换)
if (AssociatedObject.RenderTransform is not TransformGroup)
{
AssociatedObject.RenderTransform = new TransformGroup
{
Children = { new ScaleTransform(), new RotateTransform() }
};
}
// 监听尺寸变化更新缩放中心
AssociatedObject.SizeChanged += (s, e) =>
(AssociatedObject.RenderTransform as TransformGroup)
.Children.OfType<ScaleTransform>().First().CenterX = e.NewSize.Width / 2;
}
private void AnimateScale(double delta)
{
var scaleTransform = (AssociatedObject.RenderTransform as TransformGroup)
.Children.OfType<ScaleTransform>().First();
//