Явное использование TextBlock в содержимом Label делает ContentPresenter странным образом - PullRequest
3 голосов
/ 27 февраля 2011

У меня есть кастом ControlTemplate с двойным ContentPresenter с.Шаблон применяется к Label.Когда я устанавливаю « Случайный осьминог » (просто текст) в качестве содержимого ярлыка, он работает точно так, как ожидалось.Когда я устанавливаю « Случайный осьминог » в качестве Контента, он не работает (визуально представлен только один ContentPresenter).Я использую следующий код для воспроизведения поведения:

<Window x:Class="WeirdTextBlock.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Window.Resources>
        <Style TargetType="Label">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Label">
                        <Border BorderBrush="Red" BorderThickness="1" Padding="2">
                            <Grid>
                                <ContentPresenter />
                                <ContentPresenter Margin="2,2,0,0" />
                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid Margin="20" HorizontalAlignment="Left">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="20" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Label Grid.Row="0">
            Random octopus
        </Label>

        <Label Grid.Row="2">
            <TextBlock>Random octopus</TextBlock>
        </Label>
    </Grid>
</Window>

И здесь вы можете увидеть, как это выглядит:

http://i56.tinypic.com/1zgdull.png

Я думал когдавы вводите только текст в свойство Content, оно оборачивается TextBlock , так почему же визуальное представление второй метки отличается от первого?И как заставить второй Label вести себя корректно (чтобы он выглядел как первый Label, но только путем изменения шаблона)?Спасибо!

Ответы [ 2 ]

3 голосов
/ 27 февраля 2011

Основная проблема заключается в том, что вы пытаетесь разместить визуал (TextBlock) в двух разных местах одновременно. Визуал может иметь только одного родителя, поэтому один из предъявителей контента «выигрывает», а другой не будет иметь никакого контента.

Если все, что вы хотите сделать, это визуально скопировать TextBlock, тогда используйте VisualBrush.

1 голос
/ 27 февраля 2011

Разница составляет ...

  • Когда вы устанавливаете строку в качестве Контента для Label, для каждой строки ContentPresenter.

Обновление

<Style TargetType="Label">
    <Style.Resources>
        <local:TypeOfConverter x:Key="TypeOfConverter"/>
        <Style TargetType="TextBlock">
            <Setter Property="Background" Value="Transparent"/>
        </Style>
    </Style.Resources>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Label">
                <Border BorderBrush="Red" BorderThickness="1" Padding="2">
                    <Grid>
                        <ContentPresenter Name="content" Grid.ZIndex="2"/>
                        <ContentPresenter Name="secondContent" Grid.ZIndex="1" Margin="2,2,0,0" Visibility="Collapsed"/>
                        <Border Grid.ZIndex="1">
                            <Border.RenderTransform>
                                <TranslateTransform X="2" Y="2"/>
                            </Border.RenderTransform>
                            <Border.Background>
                                <VisualBrush Visual="{Binding ElementName=content, Path=Content}"/>
                            </Border.Background>
                        </Border>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},
                                                   Path=Content,
                                                   Converter={StaticResource TypeOfConverter}}"
                                 Value="{x:Type sys:String}">
                        <Setter TargetName="secondContent" Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

TypeOfConverter

public class TypeOfConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (value == null) ? null : value.GetType();
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
...