2011-08-30 65 views
3

我正在构建一个自定义的UserControl,它允许我在ProgressBar中放置文本。问题是,没有一个ProgressBar的DependencyProperties被转移。这是我的自定义UserControl的XAML。访问UserControl的内部控件

<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访问和设置最小值,最大值,值等。

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

我希望我不需要重新定义一堆DependencyProperties以获得此功能。

回答

2

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

在usercontrol的代码隐藏代码中使用内置代码段中的“propdp”。

让我们以ProgressBar.Maximum例如:

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

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

当你使用你的应用程序的另一部分控制,只需输入一个值这样的:

在你的用户控件的XAML中,这种方式将其绑定

<local:MyCustomProgressBar x:Name="uiLoadTime" InnerProgressBarMax="50" /> 

冲洗&重复您想要公开的每个属性。

编辑: 如果您确实需要暴露50+ DP,则可以通过为您的DP指定智能默认值来降低杵。

要做到这一点,当你创建一个DP,设置new PropertyMetadata(YOUR_DEFAULT_VALUE)

参数一旦做到这一点,你可以控制很多暴露的DPS,但你只需要在XAML代码手动设置几使用该控件。

+1

是的,但我真的不想处理重新定义50个不同的PropertyDependencies并处理它们的Coerce和Validation方法时,我可以直接访问它们。 – Dave

+0

你能否请你在需要暴露的许多不同的DP上逃避?你可能会遇到一个架构问题。另请参阅我的编辑。 –

1

将所有内容封装在DependencyProperties中的替代方法是让UserControl的用户提供ProgressBar。它看起来是这样的:

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

然后在MyCustomProgressBar.xaml.cs,你会暴露一个进度条公共财产。在其setter中,修改属性,但是将其添加到UserControl的根Grid