Стиль, который активируется в зависимости от другого стиля? - PullRequest
3 голосов
/ 25 декабря 2010

Я пытаюсь создать стиль, который будет применяться только в том случае, если родительский элемент элемента, к которому относится этот стиль, имеет другой определенный стиль. Вроде как в CSS, где вы можете сделать «.class1 .class2», чтобы указать, что тема «class2» применяется, только если она находится внутри элемента с классом «class1».

Я не хочу использовать какие-либо внешние библиотеки DLL или библиотеки для этой задачи. Я хочу знать, возможно ли это реализовать самостоятельно.

Я пытался использовать MultiTriggers без удачи.

У меня есть стиль, который применяется ко всем текстовым блокам. Я хочу, чтобы текстовый блок делал следующее:

Если размер шрифта текстового блока равен 11, а стиль родительского элемента - «PinnedSuggestion», установите цвет переднего плана на «# FF505050».

Если размер шрифта текстового блока равен 11, а стиль родительского элемента - «Предложение», установите цвет переднего плана на «#FFCCCCCC».

Условия, которые я пытался написать, чтобы заставить эту работу, заключаются в следующем (условие размера шрифта верно, но другое нет). Условия находятся внутри стиля, который применяется ко всем текстовым блокам в целом.

                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=FontSize}" Value="11" />
                        <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Style}" Value="{StaticResource PinnedSuggestion}" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Foreground" Value="#FFFF5050"></Setter>
                </MultiDataTrigger>

Я не уверен, что я делаю неправильно в этом случае. Ниже вы видите мой стиль ListBoxItem для стиля «Предложение». PinnedSuggestion выглядит точно так же (за исключением нескольких незначительных изменений).

<Style x:Key="Suggestion" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBoxItem">
                <Grid Name="Container" Margin="0,0,0,0">
                    <Rectangle Margin="0,2,0,2" Stroke="Black" Name="Background" SnapsToDevicePixels="True" RadiusX="7" RadiusY="7" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Rectangle>
                    <Rectangle Margin="2,4,2,4" Name="BackgroundTwo" StrokeThickness="3"  SnapsToDevicePixels="True" RadiusX="3" RadiusY="3" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Rectangle>
                    <ContentPresenter Margin="0"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Contentpresenter этого стиля ListBoxItem - это то, что содержит текстовые блоки, с которыми я хочу, чтобы этот метод работал.

Итак, подведем итог ...

Элемент ListBoxItem с примененным стилем «Предложение» будет иметь текстовый блок. Стиль TextBlock (из-за его целевого типа) будет автоматически применяться к этому, и я хочу, чтобы описанные выше условия мультитригера работали так, как должны.

Моя ситуация довольно сложно объяснить. Я объяснил все, как мог.

1 Ответ

2 голосов
/ 25 декабря 2010

Родительский элемент, стиль которого вы хотите проверить, не является прямым родителем TextBlock;это может быть произвольно выше в визуальном дереве.Таким образом, ваше второе условие должно искать предка определенного типа, подобного этому:

<Condition Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=Style}" Value="{StaticResource Suggestion}" />

Вот полный рабочий пример, протестированный с .NET4:

<Window x:Class="WpfApplication1.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>
    <Style x:Key="Suggestion" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Grid Name="Container" Margin="0,0,0,0">
                        <Rectangle Margin="0,2,0,2" Stroke="Blue" Name="Background" SnapsToDevicePixels="True" RadiusX="7" RadiusY="7" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Rectangle>
                        <Rectangle Margin="2,4,2,4" Name="BackgroundTwo" StrokeThickness="3"  SnapsToDevicePixels="True" RadiusX="3" RadiusY="3" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Rectangle>
                        <ContentPresenter Margin="0"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="PinnedSuggestion" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Grid Name="Container" Margin="0,0,0,0">
                        <Rectangle Margin="0,2,0,2" Stroke="Green" Name="Background" SnapsToDevicePixels="True" RadiusX="7" RadiusY="7" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Rectangle>
                        <Rectangle Margin="2,4,2,4" Name="BackgroundTwo" StrokeThickness="3"  SnapsToDevicePixels="True" RadiusX="3" RadiusY="3" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Rectangle>
                        <ContentPresenter Margin="0"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="Neutral" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Grid Name="Container" Margin="0,0,0,0">
                        <Rectangle Margin="0,2,0,2" Stroke="Black" Name="Background" SnapsToDevicePixels="True" RadiusX="7" RadiusY="7" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Rectangle>
                        <Rectangle Margin="2,4,2,4" Name="BackgroundTwo" StrokeThickness="3"  SnapsToDevicePixels="True" RadiusX="3" RadiusY="3" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Rectangle>
                        <ContentPresenter Margin="0"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style TargetType="{x:Type TextBlock}">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=FontSize}" Value="11" />
                    <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=Style}" Value="{StaticResource Suggestion}" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Foreground" Value="Red"></Setter>
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=FontSize}" Value="11" />
                    <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=Style}" Value="{StaticResource PinnedSuggestion}" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Foreground" Value="Yellow"></Setter>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid>
    <ListBox>
        <ListBoxItem Style="{StaticResource Neutral}">
            <TextBlock FontSize="10" Text="Style=Neutral, FontSize=10"/>
        </ListBoxItem>
        <ListBoxItem Style="{StaticResource Neutral}">
            <TextBlock FontSize="11" Text="Style=Neutral, FontSize=11"/>
        </ListBoxItem>
        <ListBoxItem Style="{StaticResource Suggestion}">
            <TextBlock FontSize="10" Text="Style=Suggestion, FontSize=10"/>
        </ListBoxItem>
        <ListBoxItem Style="{StaticResource Suggestion}">
            <TextBlock FontSize="11" Text="Style=Suggestion, FontSize=11"/>
        </ListBoxItem>
        <ListBoxItem Style="{StaticResource PinnedSuggestion}">
            <TextBlock FontSize="10" Text="Style=PinnedSuggestion, FontSize=10"/>
        </ListBoxItem>
        <ListBoxItem Style="{StaticResource PinnedSuggestion}">
            <TextBlock FontSize="11" Text="Style=PinnedSuggestion, FontSize=11"/>
        </ListBoxItem>
    </ListBox>
</Grid>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...