Я пытаюсь создать стиль, который будет применяться только в том случае, если родительский элемент элемента, к которому относится этот стиль, имеет другой определенный стиль. Вроде как в 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 (из-за его целевого типа) будет автоматически применяться к этому, и я хочу, чтобы описанные выше условия мультитригера работали так, как должны.
Моя ситуация довольно сложно объяснить. Я объяснил все, как мог.