情况如下:我有一个自定义TextBox控件,其中包含多个其他TextBox控件。我需要在父控件中关闭IsTabStop,但是我仍然想公开一个新的IsTabStop属性,子文本框是模板绑定的。我写了以下代码:

using System.Windows.Controls;

public class CustomTextBox : Control {
 public CustomTextBox() {
     base.IsTabStop = false;
 }

 [Description( "Gets or sets whether a control is included in tab navigation." )]
 [Category( "Common Properties" )]
 public new bool IsTabStop
 {
     get { return (bool)GetValue( IsTabStopProperty ); }
     set { SetValue( IsTabStopProperty, value ); }
 }

 public new static readonly DependencyProperty IsTabStopProperty = DependencyProperty.Register(
     "IsTabStop",
     typeof( bool ),
     typeof( CustomTextBox ),
     new PropertyMetadata( true ) );
}


但这会导致奇怪的行为。如果未为自定义控件的实例指定IsTabStop,则即使默认值为true,它的行为也类似于IsTabStop为false。但是,如果IsTabStop被显式标记为true,则基类的IsTabStop将设置为true。另外,如果我将“ IsTabStopx”和所有相关文本(包括绑定)重命名为“ IsTabStopx”,从而不隐藏基本成员,则它会按需工作。隐藏成员不应该与全新定义一样吗?某些地方可以读取基类的IsTabStop吗?

这是怎么回事?

最佳答案

DependencyProperty系统独立于C#属性获取器和设置器运行,以方便程序员使用。

WPF / Silverlight将直接读取Control.IsTabStopProperty,并且不会使用CustomTextBox.IsTabStop属性或CustomTextBox.IsTabStopProperty DependencyProperty。

10-08 02:07