WPF / XAML Style set Свойство для дочерних элементов? - PullRequest
11 голосов
/ 02 марта 2009

Я работаю над стилем XAML для своих элементов управления. Код ниже предназначен для установки цвета панели стека. Это отлично работает, но есть кое-что еще, что я хочу сделать. Если триггер активирован, я хочу установить цвет шрифта для всех дочерних элементов внутри панели стека.

На данный момент у меня есть только текстовые блоки внутри стековой панели, и я знаю, что могу легко создать отдельный стиль для текстового блока. Но если этот стиль активирован, он будет влиять только на ОДИН, а не на ВСЕ текстовые блоки. Но я хочу изменить все элементы внутри панели стека, как только у меня будет триггер мыши для панели.

Возможно ли это даже в XAML или мне нужно кодировать обычное событие?

<Style x:Key="XStack" TargetType="StackPanel">
    <Setter Property="Background">
        <Setter.Value>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                <GradientStop Color="White" Offset="0"/>
                <GradientStop Color="SkyBlue" Offset="6"/>                    
            </LinearGradientBrush>
        </Setter.Value>
    </Setter>
    <!-- Trigger-->
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True" >
            <Setter Property="Background" Value="SkyBlue"/>
        </Trigger>
    </Style.Triggers>
</Style>    

Ответы [ 2 ]

15 голосов
/ 02 марта 2009

Добавьте это к своему триггеру:

<Setter Property="TextElement.Foreground" Value="Blue"></Setter>

3 голосов
/ 02 марта 2009

Как сказал Олле, для присоединенного свойства TextElement.Foreground можно установить пользовательское значение. Для дочернего элемента управления / узла пользовательского интерфейса в визуальном дереве, если свойство не установлено, WPF будет перемещаться по иерархии пользовательского интерфейса, пока не найдет значение и не использует его. Это означает, что все дочерние элементы управления могут совместно использовать значение свойства, определенное на родительском уровне.

Это должно работать для всех TextBlocks ... однако, если ваша StackPanel содержит TextBox, его цвет текста не будет затронут. Он использует свойство Foreground из базового класса Control ... Поэтому обязательно протестируйте его со всеми возможными типами дочерних элементов.

...