代码之家  ›  专栏  ›  技术社区  ›  Eric

Silverlight自定义控件中依赖项属性的默认值

  •  2
  • Eric  · 技术社区  · 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类

    1 回复  |  直到 14 年前
        1
  •  2
  •   AnthonyWJones    14 年前

    问题是您在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属性 通过任何方式(通过代码中的setter、动画或其他直接调用 赋值