WPF设计标准学习记录30

发布于:2025-04-13 ⋅ 阅读:(32) ⋅ 点赞:(0)
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();
        //

网站公告

今日签到

点亮在社区的每一天
去签到