Как добавить триггер в пользовательский элемент управления WPF без переопределения существующего стиля?

Я создаю простой пользовательский элемент управления, действующий от кнопки переключения, что позволяет пользователю указывать выделенный и непроверенный контент непосредственно в XAML. Он работает хорошо, но он основан на триггере, и я не знаю, как определить триггер, кроме как в стиле. Если я определяю стиль, я теряю все, что установлено за пределами настраиваемого элемента управления.

То, что я хотел бы сделать, это просто добавить этот триггер к любому существующему стилю, установленному в другом месте элемента управления.

Здесь XAML для стиля/триггера.

<ToggleButton.Style>
    <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}">
        <Setter Property="Content" Value="{Binding RelativeSource={RelativeSource Self}, Path=UncheckedContent}" />
        <Style.Triggers>
            <Trigger Property="IsChecked" Value="True">
                <Setter Property="Content"
                        Value="{Binding RelativeSource={RelativeSource Self}, Path=CheckedContent}" />
            </Trigger>
        </Style.Triggers>
    </Style>
</ToggleButton.Style>

Я пробовал наследовать стиль через BasedOn со стандартным типом, но он не будет работать, если пользовательский элемент управления имеет явный стиль, заданный его родителем. Я также рассматривал EventTriggers, но я не думаю, что было бы событие для инициализации элемента управления.

Спасибо за любую помощь, которую может предложить любой.:)

Ответы

Ответ 1

Просто для выяснения терминологии здесь: пользовательский контроль - это элемент управления, который происходит из класса UserControl. Если бы я понял, что вы правильно выбрали ToggleButton, добавьте свойства UncheckedContent и CheckedContent. В этом случае вы создали настраиваемый элемент управления. Всегда легче следовать, если мы соглашаемся на общую терминологию:)

Насколько я знаю, вы не можете выполнять такое наследование общего стиля в XAML. Вы всегда должны четко указывать, на каком стиле основан другой стиль. Ваш стиль может быть основан на стандарте по умолчанию для ToggleButton или на другом стиле. Если вы не можете построить цепочку наследования стиля, которая будет уважать это, этот подход не будет работать.

Но так как у вас есть настраиваемый элемент управления, вы не могли бы написать стиль по умолчанию для него, основанный на стиле кнопки переключения по умолчанию, подобном этому?

<Style TargetType="{x:Type CustomToggleButton}" 
       BasedOn="{StaticResource {x:Type ToggleButton}}">

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

Также вы можете написать шаблон управления (по умолчанию) для своей новой кнопки переключения в Themes\Generic.xaml, которая содержит вышеуказанные триггеры. В blend вы можете получить копию шаблона по умолчанию для кнопки переключения ( "Редактировать шаблон" → "Редактировать копию" ), чтобы вы могли убедиться, что ваша кнопка переключения выглядит так же, как и обычная кнопка переключения. Затем включите триггеры выше в этот шаблон.

BTW: вам не нужно создавать новый элемент управления только для добавления новых свойств. Вы можете добавить новые свойства в существующий элемент управления с помощью прикрепленных свойств. Они могут использоваться из XAML, как и обычные свойства.