我创建了几个UserControls,它们有一些常见的属性。是否可以创建一个base-UserControl,具体的可以从中派生出来?
基类:
public class LabeledControlBase : UserControl {
public string ControlWidth {
get { return (string)GetValue(ControlWidthProperty); }
set { SetValue(ControlWidthProperty, value); }
}
// Using a DependencyProperty as the backing store for ControlWidth. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ControlWidthProperty =
DependencyProperty.Register("ControlWidth", typeof(string), typeof(LabeledControlBase), new PropertyMetadata("Auto"));
}
具体类:
public partial class LabeledTextBox : Base.LabeledControlBase {
public string LabelText {
get { return (string)GetValue(LabelTextProperty); }
set { SetValue(LabelTextProperty, value); }
}
// Using a DependencyProperty as the backing store for LabelText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty LabelTextProperty =
DependencyProperty.Register("LabelText", typeof(string), typeof(LabeledTextBox), new PropertyMetadata(null));
public string TextBoxText {
get { return (string)GetValue(TextBoxTextProperty); }
set { SetValue(TextBoxTextProperty, value); }
}
// Using a DependencyProperty as the backing store for TextBoxText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextBoxTextProperty =
DependencyProperty.Register("TextBoxText", typeof(string), typeof(LabeledTextBox), new PropertyMetadata(null));
我想要实现的目标: 我希望能够在任何UserControl上设置“ControlWidth”属性,该属性派生自“LabeledControlBase”。
问题是什么: 我意识到它的方式我的LabeledTextBox无法识别GetValue和SetValue方法,尽管它继承自UserControl派生的LabeledControlBase。将Base.LabeledControlBase更改为UserControl时,一切正常(除非我无法访问常用的属性)。
答案 0 :(得分:1)
由于我没有看到LabeledTextBox.xaml
我无法确定,但我怀疑你的XAML有些不对 - 可能使用UserControl
作为根? XAML看起来应该是这样的:
<wpf:LabeledControlBase
x:Class="WPF.LabeledTextBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:wpf="clr-namespace:WPF"
x:Name="self"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBox Text="{Binding ElementName=self, Path=ControlWidth}" />
</Grid>
</wpf:LabeledControlBase>
...以LabeledControlBase
为根。这让我可以在页面中使用LabeledTextBox
控件:
<wpf:LabeledTextBox ControlWidth="Hi" />
(ControlWidth
的预期语义可能不是我正在用它做的;这只是为了验证事情是否正常。而且它们确实如此。)