无法访问ControlTemplate中TextBlock的Text属性

时间:2015-05-27 14:18:17

标签: c# wpf

我正在尝试将属性数据绑定到Label并更改其颜色和文本以响应绑定属性的值。我正在使用ControlTemplate来更改颜色和文本,因为更改标签的内容以响应DataTriggers不起作用(文本从未出现)。

因此,使用ControlTemplate在Label上内联定义时可以正常工作,但在将模板定义为资源时似乎不起作用。

下面的代码是一个更简单的示例,用于演示此问题。

这是我到目前为止所做的:

    <ResourceDictionary>
        <ControlTemplate x:Key="baseTemplate" TargetType="{x:Type Label}">
            <Grid Background="{TemplateBinding Background}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="24"/>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="24"/>
                </Grid.ColumnDefinitions>
                <TextBlock x:Name="InnerTextBlock" Grid.Column="1"
                           Text="{TemplateBinding Label.Content}" <!-- An attempt to tie the Text here to the Label's Content property -->
                           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                           Padding="{TemplateBinding Padding}"
                           Background="{TemplateBinding Background}"
                           Foreground="{TemplateBinding Foreground}"
                           Width="{TemplateBinding Width}"
                           Height="{TemplateBinding Height}"
                     />
            </Grid>
        </ControlTemplate>

        <Style x:Key="availableLabelStyle" TargetType="{x:Type Label}">
            <Setter Property="Background" Value="#FF567E4A"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Content" Value="Available"/>
            <Setter Property="Template" Value="{StaticResource baseTemplate}"/>
        </Style>
    </ResourceDictionary>

    <Label x:Name="StatusLabel"
           Style="{StaticResource availableLabelStyle}"
           Grid.Column="1"
           HorizontalAlignment="Left"
           Margin="111,71,0,0"
           VerticalAlignment="Top" Width="124"
           HorizontalContentAlignment="Center"
           VerticalContentAlignment="Center"
           Height="18"
           Padding="2"
    />

问题是Setter中'availableLabelStyle'的Content属性似乎不起作用。将此样式应用于Label时,不会显示任何文本。

有没有更好的方法在这里做同样的事情并让文字出现在标签?

提前感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:3)

您拥有的代码正在运作。这是我的完整示例:

<Window x:Class="WPFTestApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary>
    <ControlTemplate x:Key="baseTemplate" TargetType="{x:Type Label}">
        <Grid Background="{TemplateBinding Background}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="24"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="24"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="1" Text="{TemplateBinding Label.Content}"
                           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                           Padding="{TemplateBinding Padding}"
                           Background="{TemplateBinding Background}"
                           Foreground="{TemplateBinding Foreground}"
                           Width="{TemplateBinding Width}"
                           Height="{TemplateBinding Height}"/>
        </Grid>
    </ControlTemplate>

    <Style x:Key="availableLabelStyle" TargetType="{x:Type Label}">
        <Setter Property="Background" Value="#FF567E4A"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Content" Value="Available"/>
        <Setter Property="Template" Value="{StaticResource baseTemplate}"/>
    </Style>
</ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Label x:Name="StatusLabel" Style="{StaticResource availableLabelStyle}"
           Grid.Column="1"
           HorizontalAlignment="Left"
           Margin="111,71,0,0"
           VerticalAlignment="Top" Width="124"
           HorizontalContentAlignment="Center"
           VerticalContentAlignment="Center"
           Height="18"
           Padding="2"/>
    </Grid>
</Window>

产生以下输出:

enter image description here

答案 1 :(得分:1)

另一种方法是使用ContentPresenter代替TextBlock。您仍然可以向其添加所有其他属性(至少是您显示的属性),并且它将允许显示除文本之外的其他内容。