【问题标题】:How do I expose custom control properties inside a user control?如何在用户控件中公开自定义控件属性?
【发布时间】:2010-08-19 03:53:39
【问题描述】:

我有一个名为TextBoxWithLabelAndUnits 的自定义控件。从名字可以看出是TextBox,前面有Label,后面有Label,所以自定义控件如下:

       -----------------
Label: |               | units
       -----------------

我暴露了几个依赖属性来配置控件,比如:

LabelWidth
LabelText
UnitText
TextBoxWidth

现在我有一个名为LatLong 的用户控件,用于输入纬度/经度。 XAML 如下所示:

<UserControl ...>
    <StackPanel>
        <TextBoxWithLabelAndUnits LabelText="Latitude:"
                                  UnitText="degrees"
        />
        <TextBoxWithLabelAndUnits LabelText="Longitude:"
                                  UnitText="degrees" 
        />
    </StackPanel>
</UserControl>

它将创建一个如下所示的用户控件:

           -----------------
Latitude:  |               | degrees
           -----------------
           -----------------
Longitude: |               | degrees
           -----------------

现在我想在项目中使用我的用户控件。但是,我希望用户控件公开属性,这样如果我不喜欢默认设置,我可以更改标签。我可以将每一个都暴露为一个新的依赖属性,如下所示:

LatitudeLabelWidth
LatitudeLabelText
LatitudeUnitText
LatitudeTextBoxWidth

LongitudeLabelWidth
LongitudeLabelText
LongitudeUnitText
LongitudeTextBoxWidth

使用 LatLong 控件的 XAML 将如下所示:

<Window ...>
    <LatLong LatitudeLabelText="Latitude (in degrees)"
             LatitudeUnitText=""
             LongitudeLabelText="Longitude (in degrees)"
             LongitudeUnitText=""
    />
</Window>

但这似乎需要做很多工作,因为我必须重新公开每个实例的每个依赖项属性。我想知道是否有更简单的方法可以公开 TextBoxWithLabelAndUnits 实例本身,因此我可以直接在其上编辑属性并使用如下所示的 XAML:

<Window ...>
    <LatLong Latitude.LabelText="Latitude (in degrees)"
             Latitude.UnitText=""
             Longitude.LabelText="Longitude (in degrees)"
             Longitude.UnitText=""
    />
</Window>

换句话说,我不是在用户控件中公开每个自定义控件的属性,而是公开自定义控件本身并使用点表示法访问所有属性。

有人知道在 WPF 中是否可以这样做吗?

【问题讨论】:

    标签: .net wpf user-controls custom-controls dependency-properties


    【解决方案1】:

    当然——你为什么不给你的LatLong这两个属性?

    public TextBoxWithLabelAndUnits LatitudeControl
    {
        get { return latitude; }
    }
    
    public TextBoxWithLabelAndUnits LongitudeControl
    {
        get { return longitude; }
    }
    

    然后就可以通过代码直接访问了。

    【讨论】:

    • 嗨,Dan,我试过了,虽然它允许您在代码中访问控件,但我还需要能够在 XAML 中设置属性。知道在这种情况下我能做什么吗?
    猜你喜欢
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2020-04-11
    • 2010-11-25
    • 2011-01-20
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多