创建基本用户控件

本文关键字:控件 用户 创建 | 更新日期: 2023-09-27 18:31:51

我创建了几个用户控件,它们有一些共同的属性。是否可以创建一个基本用户控件,从中可以派生具体的控件?

基类:

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));

我想要实现的目标:我希望能够在任何派生自"LabeledControlBase"的用户控件上设置"ControlWidth"属性。

问题出在哪里:我意识到它的方式,我的LabeledTextBox无法识别GetValue和SetValue方法,尽管它继承自LabeledControlBase,它派生自UserControl。当将Base.LabeledControlBase更改为UserControl时,一切正常(除了我无法访问我常用的属性)。

创建基本用户控件

由于我没有看到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的预期语义可能不是我正在用它做的事情;这只是为了验证事情是否有效。他们确实如此。