通过依赖项属性替换用户控件中的控件

时间:2011-06-29 18:10:40

标签: silverlight dependency-properties visual-tree

我做了一个简单的项目来说明我的问题。我有一个用户控件('ButtonPod'),它包含一个按钮和一个矩形:

<UserControl x:Class="SilverlightDependencyProp.ButtonPod"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
    <Rectangle Fill="Blue" />
    <Button x:Name="ButtonOnPage" Margin="50" Content="Old button content" />
</Grid>

</UserControl>

我希望在整个应用程序中使用此用户控件,但我需要在中间更改Button。我需要控制Button的所有属性,所以我不想只暴露像'ButtonText'或'ButtonSize'这样的DependencyProperties - 我宁愿在每次使用控件时定义整个Button。所以我设置了一个依赖属性('CenterButton'),如下所示:

    public Button CenterButton
    {
        get { return (Button)GetValue(CenterButtonProperty); }
        set { SetValue(CenterButtonProperty, value); }
    }

    public static readonly DependencyProperty CenterButtonProperty =
        DependencyProperty.Register("CenterButton", typeof(Button),
        typeof(ButtonPod), new PropertyMetadata(
        CenterButtonChanged));

    private static void CenterButtonChanged(DependencyObject d,
      DependencyPropertyChangedEventArgs e)
    {
        var pod = d as ButtonPod;
        pod.ButtonOnPage = e.NewValue as Button;
    }

然后我尝试在我的MainPage.xaml中定义'CenterButton',在我的用户控件中:

<Grid x:Name="LayoutRoot" Background="White">
    <local:ButtonPod Width="200" Height="200">
        <local:ButtonPod.CenterButton>
            <Button Content="New button content" />   
        </local:ButtonPod.CenterButton>
    </local:ButtonPod>
</Grid>

但是当我加载应用程序时,我看到的只是一个显示“旧按钮内容”的按钮 - 为什么我的按钮不被替换?单步执行,我可以看到DependencyProperty被点击并且'ButtonOnPage'属性被设置,但是可视树不会更新。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

设置命名元素不会替换它。您想要命名父项并将子项添加到该项(替换现有子项)。