zoukankan      html  css  js  c++  java
  • WPF 通过名称查找属性(DependencyProperty)

    使用名称来查找DependencyProperty。

    如果有这样的需求,则是需要通过DependencyPropertyDescriptor来查找。

    通常是使用附加属性或者依赖属性的方法。

    下面给出附加属性的例子:

     这个是注册附加属性,利用string来输入要查找的属性

            

    public static readonly DependencyProperty AniInvokeParameterProperty = DependencyProperty.RegisterAttached("AniInvokeParameter", typeof(string), typeof(AniInvoke)); public static void SetAniInvokeParameter(DependencyObject d, string value) => d.SetValue(AniInvokeParameterProperty, value); public static string GetAniInvokeParameter(DependencyObject d) => (string)d.GetValue(AniInvokeParameterProperty);

    具体DependencyPropertyDescriptor使用

     public static readonly DependencyProperty AniInvokePropery = DependencyProperty.RegisterAttached("AniInvoke", typeof(AnimationTimeline), typeof(AniInvoke), new PropertyMetadata(null, AniInvokeCallBack));
    
            public static void SetAniInvoke(DependencyObject d, AnimationTimeline value) => d.SetValue(AniInvokePropery, value);
    
            public static AnimationTimeline GetAniInvoke(DependencyObject d) => (AnimationTimeline)d.GetValue(AniInvokePropery);
    
            private static void AniInvokeCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                var t = d as FrameworkElement;
    
                var dpName = t.GetValue(AniInvokeParameterProperty) as string;
    
               
                if (!string.IsNullOrWhiteSpace(dpName))
                {
                    var dpd = DependencyPropertyDescriptor.FromName(dpName, t.GetType(), t.GetType());
    
                    var property = dpd.DependencyProperty;
    
                    var ani = (AnimationTimeline)e.NewValue;
    
                    if (property != null && ani != null)
    
                        t.BeginAnimation(property, ani);
                }
               
            }

    Xaml 代码

    <Grid Grid.Row="1" Background="Red"  ado:AniInvoke.AniInvokeParameter="Width"  >
                <ado:AniInvoke.AniInvoke>
                    <DoubleAnimationUsingKeyFrames>
                        <EasingDoubleKeyFrame Value="30" KeyTime="00:00:02">
                            <EasingDoubleKeyFrame.EasingFunction>
                                <CubicEase EasingMode="EaseOut"/>
                            </EasingDoubleKeyFrame.EasingFunction>
                        </EasingDoubleKeyFrame>
                        <EasingDoubleKeyFrame Value="500" KeyTime="00:00:06">
                            <EasingDoubleKeyFrame.EasingFunction>
                                <BounceEase Bounces="5" EasingMode="EaseOut"/>
                            </EasingDoubleKeyFrame.EasingFunction>
                        </EasingDoubleKeyFrame>
                    </DoubleAnimationUsingKeyFrames>
                </ado:AniInvoke.AniInvoke>
    </Grid>

  • 相关阅读:
    maven导入项目时出现“Cannot read lifecycle mapping metadata …… invalid END header (bad central directory offset)pom”错误的解决方法
    Eclipse下使用Git
    Sprint Boot入门(1):创建第一个Spring Boot应用
    Gradle入门(6):创建Web应用项目
    Gradle入门(5):创建二进制发布版本
    maven在windows10系统下安装配置和打包war
    Windows10系统下安装配置Tomcat 9.0.1
    面试题1
    Json序列化帮助类
    NPOI帮助类
  • 原文地址:https://www.cnblogs.com/T-ARF/p/10968441.html
Copyright © 2011-2022 走看看