如何在 c# WPF 中为自定义形状对象设置动画

是的

我对 c# 和 WPF 比较陌生,也许这就是为什么我找不到(可能非常明显)我的问题的答案。我一直在尝试和谷歌搜索,但没有成功。

我有一个自定义形状类,它在 GeometryGroup 中返回 3 个 RectangleGeometries。3 个相应的矩形可以按预期显示在 MainWindow 的 Canvas 中。我现在想分别为每个矩形设置动画,比如将第一个矩形放到画布底部,旋转第二个并为第三个的宽度设置动画。

我自己的研究表明,关键是依赖属性。所以我注册了它们,但我无法让它们对矩形进行任何更改。

最好,我会在后面的代码中完成所有这些。XAML 中仅添加了 Canvas。可以做到吗?这是一些可以使用的代码。

先感谢您

using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;

namespace Test1
{
    public partial class MainWindow : Window
    {
        CustomShape customShape = new CustomShape();

        public MainWindow()
        {
            InitializeComponent();

            customShape.Fill = Brushes.Blue;
            cnvMain.Children.Add(customShape);
        }
    }

    class CustomShape : Shape
    {
        private Rect rect1, rect2, rect3;
        private RectangleGeometry rg1, rg2, rg3;
        private GeometryGroup allRectangleGeometries = new GeometryGroup();

        //Constructor
        public CustomShape()
        {
            makeCustomShape();
        }

        private void makeCustomShape()
        {
            rect1 = new Rect(50, 20, 100, 50);
            rg1 = new RectangleGeometry(rect1);
            allRectangleGeometries.Children.Add(rg1);

            rect2 = new Rect(200, 20, 60, 20);
            rg2 = new RectangleGeometry(rect2);
            allRectangleGeometries.Children.Add(rg2);

            rect3 = new Rect(300, 20, 200, 80);
            rg3 = new RectangleGeometry(rect3);
            allRectangleGeometries.Children.Add(rg3);
        }

        protected override Geometry DefiningGeometry
        {
            get
            {
                return allRectangleGeometries;
            }
        }
    }
}
是的

看来我自己找到了答案。我实现了 3 个依赖属性和一个每次属性更改时执行的回调方法。

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Test1
{
    public partial class MainWindow : Window
    {
        CustomShape customShape = new CustomShape();

        public MainWindow()
        {
            InitializeComponent();

            customShape.Fill = Brushes.Blue;
            cnvMain.Children.Add(customShape);
        }

        private void ButtonAnimate_Clicked(object sender, RoutedEventArgs e)
        {
            DoubleAnimation rec1Animation = new DoubleAnimation(500, TimeSpan.FromSeconds(1));
            customShape.BeginAnimation(CustomShape.Rec1YProperty, rec1Animation);

            DoubleAnimation rec2Animation = new DoubleAnimation(360, TimeSpan.FromSeconds(1));
            customShape.BeginAnimation(CustomShape.Rec2RotateProperty, rec2Animation);

            DoubleAnimation rec3Animation = new DoubleAnimation(400, TimeSpan.FromSeconds(1));
            customShape.BeginAnimation(CustomShape.Rec3WidthProperty, rec3Animation);
        }
    }

    class CustomShape : Shape
    {
        private Rect rect1, rect2, rect3;
        private RectangleGeometry rg1, rg2, rg3;
        private GeometryGroup allRectangleGeometries = new GeometryGroup();

        public double Rec1Y
        {
            get { return (double)GetValue(Rec1YProperty); }
            set { SetValue(Rec1YProperty, value); }
        }
        public static readonly DependencyProperty Rec1YProperty =
            DependencyProperty.Register("Rec1Y", typeof(double), typeof(CustomShape), new PropertyMetadata(20d, new PropertyChangedCallback(OnAnyPropertyChanged)));

        public double Rec2Rotate
        {
            get { return (double)GetValue(Rec2RotateProperty); }
            set { SetValue(Rec2RotateProperty, value); }
        }
        public static readonly DependencyProperty Rec2RotateProperty =
            DependencyProperty.Register("Rec2Rotate", typeof(double), typeof(CustomShape), new PropertyMetadata(0d, new PropertyChangedCallback(OnAnyPropertyChanged)));

        public double Rec3Width
        {
            get { return (double)GetValue(Rec3WidthProperty); }
            set { SetValue(Rec3WidthProperty, value); }
        }
        public static readonly DependencyProperty Rec3WidthProperty =
            DependencyProperty.Register("Rec3Width", typeof(double), typeof(CustomShape), new PropertyMetadata(200d, new PropertyChangedCallback(OnAnyPropertyChanged)));

        //Constructor
        public CustomShape()
        {
            makeCustomShape();
        }

        private void makeCustomShape()
        {
            rect1 = new Rect(50, Rec1Y, 100, 50);
            rg1 = new RectangleGeometry(rect1);
            allRectangleGeometries.Children.Add(rg1);

            rect2 = new Rect(200, 20, 60, 20);
            rg2 = new RectangleGeometry(rect2);
            rg2.Transform = new RotateTransform(Rec2Rotate, 230, 30);
            allRectangleGeometries.Children.Add(rg2);

            rect3 = new Rect(300, 20, Rec3Width, 80);
            rg3 = new RectangleGeometry(rect3);
            allRectangleGeometries.Children.Add(rg3);
        }

        private static void OnAnyPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
        {           
            CustomShape customShape = source as CustomShape;
            customShape.allRectangleGeometries.Children.Clear();
            customShape.makeCustomShape();
        }

        protected override Geometry DefiningGeometry
        {
            get
            {
                return allRectangleGeometries;
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在WPF中为Tab控件提供自定义形状?

来自分类Dev

WPF C#如何使用x:array在WPF中的自定义模型类中绑定和设置列表

来自分类Dev

如何在 wpf 中制作自定义形状的进度条?

来自分类Dev

如何在C#WPF中保存自定义类?

来自分类Dev

如何在c#中设置WPF的位置

来自分类Dev

如何在WPF中的FormattedText的简单自定义控件中设置依赖项属性AddOwner

来自分类Dev

如何在 WPF 中重用自定义设计的窗口?

来自分类Dev

如何在C#WPF中为一组图像设置适当的布局?

来自分类Dev

如何在C#WPF中为派生类的基类设置值

来自分类Dev

如何在C#WPF中向Datagrid添加行

来自分类Dev

如何在WPF C#中绑定到类本身

来自分类Dev

如何在C#WPF中以重复模式运行MediaPlayer?

来自分类Dev

如何在Datagrid C#WPF中动态行?

来自分类Dev

如何在C#WPF中以编程方式创建DataGrid?

来自分类Dev

如何在C#或WPF中执行javascript函数

来自分类Dev

如何在Datagrid C#WPF中动态行?

来自分类Dev

如何在树视图C#WPF中插入子项

来自分类Dev

如何在C#WPF中引用和使用标签

来自分类Dev

如何在横向(WPF,C#)中打印流文档?

来自分类Dev

如何在WPF/MVVC C#中实现动态绑定

来自分类Dev

如何在 Flutter 中为自定义画家的颜色设置动画?

来自分类Dev

C#wpf-如何在自定义控件中将文本框错误传递给父级

来自分类Dev

如何在目标c中将自定义对象存储为用户默认值?

来自分类Dev

如何在设置器上为触发器WPF C#设置静态变量

来自分类Dev

如何在WPF中增加形状的厚度

来自分类Dev

如何在C ++中设置Actor的“渲染自定义深度传递”和“深度模板值”?

来自分类Dev

如何在WPF中设置单个动画重复之间的时间?

来自分类Dev

如何在目标C中为绘制的线设置动画?

来自分类Dev

如何在WPF中停止动画

Related 相关文章

  1. 1

    如何在WPF中为Tab控件提供自定义形状?

  2. 2

    WPF C#如何使用x:array在WPF中的自定义模型类中绑定和设置列表

  3. 3

    如何在 wpf 中制作自定义形状的进度条?

  4. 4

    如何在C#WPF中保存自定义类?

  5. 5

    如何在c#中设置WPF的位置

  6. 6

    如何在WPF中的FormattedText的简单自定义控件中设置依赖项属性AddOwner

  7. 7

    如何在 WPF 中重用自定义设计的窗口?

  8. 8

    如何在C#WPF中为一组图像设置适当的布局?

  9. 9

    如何在C#WPF中为派生类的基类设置值

  10. 10

    如何在C#WPF中向Datagrid添加行

  11. 11

    如何在WPF C#中绑定到类本身

  12. 12

    如何在C#WPF中以重复模式运行MediaPlayer?

  13. 13

    如何在Datagrid C#WPF中动态行?

  14. 14

    如何在C#WPF中以编程方式创建DataGrid?

  15. 15

    如何在C#或WPF中执行javascript函数

  16. 16

    如何在Datagrid C#WPF中动态行?

  17. 17

    如何在树视图C#WPF中插入子项

  18. 18

    如何在C#WPF中引用和使用标签

  19. 19

    如何在横向(WPF,C#)中打印流文档?

  20. 20

    如何在WPF/MVVC C#中实现动态绑定

  21. 21

    如何在 Flutter 中为自定义画家的颜色设置动画?

  22. 22

    C#wpf-如何在自定义控件中将文本框错误传递给父级

  23. 23

    如何在目标c中将自定义对象存储为用户默认值?

  24. 24

    如何在设置器上为触发器WPF C#设置静态变量

  25. 25

    如何在WPF中增加形状的厚度

  26. 26

    如何在C ++中设置Actor的“渲染自定义深度传递”和“深度模板值”?

  27. 27

    如何在WPF中设置单个动画重复之间的时间?

  28. 28

    如何在目标C中为绘制的线设置动画?

  29. 29

    如何在WPF中停止动画

热门标签

归档