Невозможно переопределить стиль кнопки из app.xaml в WPF

Я застрял в очень странной проблеме, и я не мог найти ее решение. Я перепробовал почти все возможные способы (даже удалить и воссоздать решение), чтобы решить эту проблему.

ПРОБЛЕМА

Я пытаюсь переопределить стиль управления по умолчанию в приложении WPF. Я определил все ресурсы и стили в App.xaml. Проблема в том, что цвет переднего плана кнопки не переопределяется во время выполнения. Удивительно, но в VS Designer он показывает переопределенный цвет (белый), но когда я запускаю приложение, он становится черным (может быть по умолчанию).

В приложении нет другого кода, который меняет стиль кнопки.

Дополнительная информация: кнопки находятся в пользовательском элементе управления и загружаются в элемент управления ContentControl MainWindow.

<SolidColorBrush x:Key = "WhiteBrush" Color = "#FFFFFF"/>
<SolidColorBrush x:Key = "BlackBrush" Color = "#000000"/>
<SolidColorBrush x:Key = "ActiveBrush" Color = "#3A71C5"/>
<SolidColorBrush x:Key = "HoverBrush" Color = "#0071C5"/>
<SolidColorBrush x:Key = "PressBrush" Color = "#3A8BF4"/>
<SolidColorBrush x:Key = "DefaultBrush" Color = "#0071F9"/>
<SolidColorBrush x:Key = "DisabledBrush" Color = "#F4F4F4"/>


<Style TargetType = "{x:Type Button}">
    <Setter Property = "Background" Value = "{StaticResource ActiveBrush}"/>
    <Setter Property = "Foreground" Value = "{StaticResource WhiteBrush}"/>
    <Setter Property = "Template">
        <Setter.Value>
            <ControlTemplate TargetType = "{x:Type Button}">
                <Border Background = "{TemplateBinding Background}" BorderBrush = "Transparent" BorderThickness = "0">
                    <ContentPresenter HorizontalAlignment = "Center" VerticalAlignment = "Center" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property = "IsMouseOver" Value = "True">
            <Setter Property = "Background" Value = "{StaticResource HoverBrush}"/>
        </Trigger>
        <Trigger Property = "IsPressed" Value = "True">
            <Setter Property = "Background" Value = "{StaticResource PressBrush}"/>
        </Trigger>
        <Trigger Property = "IsEnabled" Value = "False">
            <Setter Property = "Background" Value = "{StaticResource DisabledBrush}"/>
        </Trigger>
    </Style.Triggers>

</Style>

Кнопки в VS Designer

Невозможно переопределить стиль кнопки из app.xaml в WPF

Кнопки во время выполнения приложения

Невозможно переопределить стиль кнопки из app.xaml в WPF

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
399
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Я вставил ваш фрагмент в пример приложения WPF и завернул Button в пользовательский UserControl. Я протестировал его и показал правильно как в представлении дизайна, так и во время выполнения.

Затем я добавил следующий стиль в App.xaml:

<Style TargetType = "{x:Type TextBlock}">
     <Setter Property = "Foreground" Value = "Red"/>
</Style>

и кнопка показывала красный текст.

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


РЕДАКТИРОВАТЬ

Возможным решением может быть явное определение содержимого кнопки в самом элементе управления:

<Button>
    <TextBlock Foreground = "{StaticResource WhiteBrush}">Test</TextBlock>
</Button>

Вероятно, есть более элегантные способы сделать это, но я не мог придумать ничего другого на данный момент.

Спасибо за ваш ответ. Не могли бы вы предложить какое-либо решение? Как этого добиться, когда у нас есть этот сценарий (два стиля для изменения стиля управления по умолчанию (кнопка и текстовый блок вместе))?

Gaurang Dave 29.05.2019 10:22

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

Foglio 29.05.2019 11:11

Спасибо за Ваш ответ. Есть ли способ добиться этого, внеся изменения в стиль или шаблон? Я не хочу менять все кнопки пользовательского интерфейса. :( Я пытаюсь создать тему для приложения.

Gaurang Dave 29.05.2019 11:14

Если вы уверены, что на ваших кнопках будет только текст, вы можете применить предложенное мной решение непосредственно в ControlTemplate, которое вы определили в Style. Это не очень хорошее решение, но оно должно работать, пока кто-то другой не предложит лучший подход.

Foglio 29.05.2019 11:24

Другие вопросы по теме