c#覆盖系统控件的依赖项属性

时间:2011-11-25 06:23:09

标签: c# properties override

您好我已经阅读了stackoverflow中的一些相关问题,但仍然无法弄清楚如何解决我的问题:

我需要创建一个与GroupBox相同的CheckableGroupBox控件,但在标题中有一个复选框。它有以下要求:

  1. 原始GroupBox有一个Object类型的Header属性,我需要将CheckableGroupBox中的这个属性限制为仅字符串。

  2. 用户可以通过调用myCheckableGroupBox.Header =“some text here here”来更改标题的文本(复选框的文本)。

  3. 我写了以下代码来提供这些建议:

    public class CheckableGroupBox : System.Windows.Controls.GroupBox
    {
        //override the default header property
        private static void OnHeaderChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            CheckableGroupBox me = o as CheckableGroupBox;
            me.labHeader.Content = e.NewValue.ToString();        
        }
    
        public CheckableGroupBox() : base()
        {
            //setup the header of the group box
    
            //create the stack panel, add the checkbox and the label
            System.Windows.Controls.StackPanel sp = new System.Windows.Controls.StackPanel();
            sp.Orientation = System.Windows.Controls.Orientation.Horizontal;
            this.chkHeader = new System.Windows.Controls.CheckBox();
            sp.Children.Add(this.chkHeader);
            sp.Children.Add(this.labHeader);
    
            //set the header to be the stack panel.
            this.Header = sp;
    
            //override the default HeaderProperty
            CheckableGroupBox.HeaderProperty.OverrideMetadata(
                typeof(object), 
                new PropertyMetadata("", OnHeaderChangedCallback)
                );
        }
    

    }

    但是,代码不起作用。当我将CheckableGroupBox(在设计视图中)添加到窗口时,它会提示:

    无法创建“CheckableGroupBox”的实例,Object'类型必须从DependencyObject派生。

    有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您应该使用:

   System.Windows.Controls.GroupBox.HeaderProperty.OverrideMetadata(
            typeof(CheckableGroupBox), 
            new PropertyMetadata("", OnHeaderChangedCallback)
            );

答案 1 :(得分:0)

[CommonDependencyProperty]
public static readonly DependencyProperty FontSizeProperty = TextElement.FontSizeProperty.AddOwner(typeof (Control), (PropertyMetadata) new FrameworkPropertyMetadata((object) SystemFonts.MessageFontSize, FrameworkPropertyMetadataOptions.Inherits));