Как узнать, использовать ли стиль или переопределить шаблон элемента управления? - PullRequest
2 голосов
/ 29 января 2009

Этот вопрос вдохновлен этим недавним вопросом и другими ситуациями, с которыми я столкнулся при разработке WPF. Как узнать, достаточно ли установить стиль элемента управления, чтобы переопределить поведение по умолчанию по сравнению с созданием нового шаблона элемента управления?

Более конкретно, в приведенном выше вопросе автор хочет изменить внешний вид ListBoxItem при его выборе. (См. Код, перепечатанный ниже). Все работает, кроме свойства Background. Как можно знать, что для этого они должны переопределить шаблон управления?

<Style TargetType="{x:Type ListBoxItem}">
        <Setter Property="Content" Value="{Binding Path=Name}"/>
        <Setter Property="Margin" Value="2"/>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="FontSize" Value="18"/>
                <Setter Property="Background" Value="Yellow"/>
                <Setter Property="Foreground" Value="Red"/>
            </Trigger>
        </Style.Triggers>

    </Style>

Ответы [ 4 ]

4 голосов
/ 29 января 2009

Относительно того, использовать ли стиль или шаблон, Рэй предоставил отличный ответ.

Что касается того, как решить вашу проблему без создания шаблона, может быть, я могу помочь.

Цвет фона устанавливается SystemColors. Используя Blend и создав шаблон, вы можете увидеть точный xaml.

Так что, если НЕТ ШАБЛОНОВ! это требование, которое вы всегда можете изменить, что это за ресурс.

Пример:

    <ListBox>  
        <ListBox.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                             Color="Yellow" />

            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Content" Value="{Binding Path=Name}"/>
                <Setter Property="Margin" Value="2"/>
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold"/>
                        <Setter Property="FontSize" Value="18"/>                            
                        <Setter Property="Foreground" Value="Red"/>
                    </Trigger>
                </Style.Triggers>

            </Style>

        </ListBox.Resources>

        <ListBoxItem>Test 1</ListBoxItem>
        <ListBoxItem>Test 2</ListBoxItem>
        <ListBoxItem>Test 3</ListBoxItem>
    </ListBox>

Это даст вам цвет фона для данного списка ListBox и ничего не испортит в приложении.

3 голосов
/ 29 января 2009

Стили могут быть очень близки к стилям CSS в HTML. Если все, что вы хотите сделать, это изменить основные свойства элемента управления, такие как Фон, Передний план или любые другие свойства, которые он предоставляет, тогда Стиль - это именно то, что вам нужно. Стили также позволяют применять триггеры, поэтому для анимации достаточно стиля.

Если вы обнаружите, что хотите изменить внутреннее поведение / внутреннюю работу элемента управления, тогда вам нужен шаблон элемента управления. Например, если вы хотите изменить расположение кнопок, добавив какое-то поведение сетки, то использование шаблона элемента управления - это путь вперед.

0 голосов
/ 29 января 2009

Под «фоном» я понимаю «синий» прямоугольник, который окружает элемент ListBoxItem при его выборе?

На самом деле это свойство FocusVisualStyle , которое представляет собой стиль, описывающий, как должен выглядеть элемент, когда он находится в фокусе. Элемент управления явно устанавливает это свойство (описано здесь ), поэтому для его переопределения вам придется переопределить шаблон элемента управления, убедившись, что для установки значения по умолчанию {x: Null} используется набор параметров по умолчанию .

0 голосов
/ 29 января 2009

К сожалению, для вашего конкретного примера вы не узнаете, если не попробуете. По сути, сначала вы пробуете его со стилем .... и если по какой-то причине это не сработает, вы пишете ControlTemplate. Обычно вы пишете ControlTemplates только по причинам, упомянутым Рэем.

Я предполагаю, что триггер, который вы пытаетесь установить, также жестко задан в ControlTemplate ... что плохо для дизайна, потому что не позволяет стилю переопределять его.

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