【问题标题】:Default Value for Dependency Property in Silverlight Custom ControlSilverlight 自定义控件中依赖属性的默认值
【发布时间】:2010-10-22 16:20:14
【问题描述】:

我在 SL 中设置了一个自定义控件,我正在尝试让控件的默认外观正常运行。我觉得(在一些聪明人的帮助下)我已经非常接近实现这个目标了,但我还没有完全做到。

当我的控件第一次添加到 Blend 中的面板时,它会根据模板按我预期的方式显示,并且当我修改我公开的依赖项属性时,它们也可以正常工作。我现在遇到的问题是,当通过 Blend 进行更改然后使用选项框“重置”该值时,它会重置“杂项”窗格下的属性,但实际上不会在设计视图中更改控件本身,除非我再次构建项目。

这是我目前拥有的代码:

    public enum SolidGlossTypes
    {
        Normal,
        Header,
        Footer,
        None
    }

    public SolidGlossTypes SolidGlossType
    {
        get
        {
            return (SolidGlossTypes)GetValue(SolidGlossTypeProperty);
        }
        set
        {
            SetValue(SolidGlossTypeProperty, value);
            switch (value)
            {
                case SolidGlossTypes.Header:
                    SolidGloss_Upper.Visibility = Visibility.Visible;
                    SolidGloss_Lower.Visibility = Visibility.Collapsed;
                    break;
                case SolidGlossTypes.Footer:
                    SolidGloss_Upper.Visibility = Visibility.Collapsed;
                    SolidGloss_Lower.Visibility = Visibility.Visible;
                    break;
                case SolidGlossTypes.None:
                    SolidGloss_Upper.Visibility = Visibility.Collapsed;
                    SolidGloss_Lower.Visibility = Visibility.Collapsed;
                    break;
                default:
                    SolidGloss_Upper.Visibility = Visibility.Visible;
                    SolidGloss_Lower.Visibility = Visibility.Visible;
                    break;
            }
        }
    }

    public static readonly DependencyProperty SolidGlossTypeProperty = DependencyProperty.Register("SolidGlossType", typeof(SolidGlossTypes), typeof(SolidGloss), new PropertyMetadata(SolidGlossTypes.Normal));

我尝试修改属性更改的回调,但没有任何成功让它工作。

另外,是否可以将依赖属性的默认值设置为 generic.xaml 中的样式,然后从模板绑定到该样式?

提前致谢,

E

【问题讨论】:

    标签: silverlight custom-controls dependency-properties


    【解决方案1】:

    问题是您在 Setter 中放置了额外的代码。使用依赖属性时,并不总是调用 setter,例如,当一些其他外部代码调用 SetValue 传入 SolidGlossTypeProperty 和新值时,不会调用您的 setter。

    您应该使用属性回调方法来执行其他操作。

    编辑

    例如:-

    public SolidGlossTypes SolidGlossType 
    { 
        get 
        { 
            return (SolidGlossTypes)GetValue(SolidGlossTypeProperty); 
        } 
        set 
        { 
            SetValue(SolidGlossTypeProperty, value);  
        } 
    } 
    
    public static readonly DependencyProperty SolidGlossTypeProperty = DependencyProperty.Register(
        "SolidGlossType",
        typeof(SolidGlossTypes),
        typeof(SolidGloss),
        new PropertyMetadata(SolidGlossTypes.Normal, OnSolidGlossTypePropertyChanged)); 
    
    
    private static void OnSolidGlossTypePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
            SolidGloss source = d as SolidGloss;
            SolidGlossTypes value = (SolidGlossTypes)e.NewValue
    
            switch (value) 
            { 
                case SolidGlossTypes.Header: 
                    source.SolidGloss_Upper.Visibility = Visibility.Visible; 
                    source.SolidGloss_Lower.Visibility = Visibility.Collapsed; 
                    break; 
                case SolidGlossTypes.Footer: 
                    source.SolidGloss_Upper.Visibility = Visibility.Collapsed; 
                    source.SolidGloss_Lower.Visibility = Visibility.Visible; 
                    break; 
                case SolidGlossTypes.None: 
                    source.SolidGloss_Upper.Visibility = Visibility.Collapsed; 
                    source.SolidGloss_Lower.Visibility = Visibility.Collapsed; 
                    break; 
                default: 
                    source.SolidGloss_Upper.Visibility = Visibility.Visible; 
                    source.SolidGloss_Lower.Visibility = Visibility.Visible; 
                    break; 
            }
    }
    

    在这种安排下,无论何时SolidGlossTypeProperty 的值通过任何方式(代码中的设置器、动画或其他对SetValue 的直接调用)发生更改,都会调用回调属性更改方法。

    【讨论】:

    • +1,另外,您可能需要考虑将枚举设为第一类对象并将关联的值放在上面而不是在您的 set 方法中
    • 好吧,我不知道如何使用属性回调方法(我不知道在 switch 语句中放什么而不是 'value'。
    • Alex:我不明白你的意思。
    • @Anthony:好的,我现在明白了,谢谢。回复较晚,抱歉。一个星期我在 Flash 中,另一个在 Silverlight 中,谁知道在那之后的一周还有什么。尽量保持在最重要的事情上。关于上述编辑的一个问题;应该“新的PropertyMetadata(SolidGlossTypes.Normal,SolidGlossTypePropertyChanged));”居然读到“new PropertyMetadata(SolidGlossTypes.Normal, OnSolidGlossTypePropertyChanged));”?
    • 谢谢。我进行了更改,我可以看到它的发展方向,但现在该项目还有其他问题。我觉得这对这一点有用,所以我会把它标记为答案,看看如果我回到它会发生什么。你就是那个人,安东尼!
    猜你喜欢
    • 2011-12-01
    • 2011-03-24
    • 2011-04-11
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2012-08-07
    相关资源
    最近更新 更多