情况如下:我有一个自定义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。