从Thumb控件的子类更新ControlTemplate的控件文本

时间:2017-05-21 14:26:57

标签: c# wpf user-controls controltemplate

我有一个继承Thumb的类(为简洁而截断):

public class MyControl : Thumb
{
    public MyControl()
      : base()
    {
        this.MinWidth = 80;
        this.MinHeight = 60;

        /* ... */
    }
}

我有一个ControlTemplate,如下所示:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<ControlTemplate x:Key="MyControlTemplate">
    <Border BorderBrush="Black" BorderThickness="1" Name="border">
        <StackPanel>
            <StackPanel.Background>
                <SolidColorBrush Color="White" Opacity="1"/>
            </StackPanel.Background>
            <TextBlock Name="controlType" Padding="5,0,5,3" HorizontalAlignment="Stretch" TextAlignment="Center">
                <TextBlock.Background>
                    <SolidColorBrush Color="#FFC0C0C0" Opacity="1"/>
                </TextBlock.Background>
            </TextBlock>
        </StackPanel>
    </Border>
</ControlTemplate>

我在另一个类中实例化MyControl的实例,并尝试在模板中设置Text TextBlock控件的controlType属性。

public System.Windows.UIElement Create()
{
    MyControl control = new MyControl();
    var template = Application.Current.Resources["MyControlTemplate"] as ControlTemplate;

    var contents = template.LoadContent();
    var panel = (StackPanel)VisualTreeHelper.GetChild(contents, 0);
    foreach (var textBlock in panel.Children.OfType<TextBlock>())
    {
        switch (textBlock.Name)
        {
            case "controlType":
                textBlock.Text = "MyText";
                textBlock.InvalidateVisual();
                break;
        }
    }

    control.Template = template;
    control.UpdateLayout();

    return control;
}

但是,文本“MyText”未显示在TextBlock中。我错过了什么?

1 个答案:

答案 0 :(得分:1)

LoadContent()方法将模板的内容作为单独的实例加载。这不是你想要的。您想要设置应用于Text实例的TextBlock的{​​{1}}属性:

MyControl