访问UserControl的内部控件

3

我正在构建一个自定义的UserControl,它允许我将文本放置在进度条中。问题在于,没有任何ProgressBar的DependencyProperties被传输过来。这是我的自定义UserControl的XAML代码:

<UserControl
    x:Class = "MyProgram.MyCustomProgressBar"
    xmlns   = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" >

    <Grid>
        <ProgressBar    Name="uiProgressBar"    />
        <Label          Name="uiLabel"          />
    </Grid>
</UserControl>

当我开始使用这个UseControl时,如何从XAML中访问和设置Minimum、Maximum、Value等属性?

<local:MyCustomProgressBar x:Name="uiLoadTime" ??.uiProgressBar.Maximum="50" />

我希望不必重新定义一堆DependencyProperties,就能实现这个功能。

2个回答

2

通常的方法是使用DependencyProperty...一旦你习惯了,它并不那么糟糕。

在用户控件的代码后台使用“propdp”内置片段。

让我们以ProgressBar.Maximum为例:

创建一个整数DependencyProperty,其默认值为100(或任何您喜欢的值),将其命名为InnerProgressBarMax。

在您的UserControl的XAML中,按照以下方式进行绑定:

<ProgressBar Maximum="{Binding InnerProgressBarMax, ElementName=myUsrCtrl}" />

当您在应用程序的另一个部分使用该控件时,只需输入以下值:
<local:MyCustomProgressBar x:Name="uiLoadTime" InnerProgressBarMax="50" />

对于每个要公开的属性,请重复上述步骤。

编辑: 如果您确实需要公开50多个DP,则可以通过为您的DP指定智能默认值来降低麻烦。

为此,在创建DP时,设置new PropertyMetadata(YOUR_DEFAULT_VALUE)参数。

完成后,您的控件可能会公开许多DP,但是在使用控件的XAML代码中,只需手动设置少数DP即可。


1
是的,但我真的不想重新定义50个不同的PropertyDependencies并处理它们的Coerce和Validation方法,当我可以直接访问它们时。 - Dave
你能否详细说明需要暴露的许多不同DP吗?你可能有一个架构问题。另外,请查看我的编辑。 - Louis Kottmann

1
与将所有内容包装在DependencyProperties中的替代方案是让UserControl的使用者提供ProgressBar。它可能看起来像这样:
然后在MyCustomProgressBar.xaml.cs中,您将公开一个ProgressBar的公共属性。在其setter中,根据需要修改属性,然后将其添加到UserControl的根Grid中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接