Я застрял в очень странной проблеме, и я не мог найти ее решение. Я перепробовал почти все возможные способы (даже удалить и воссоздать решение), чтобы решить эту проблему.
ПРОБЛЕМА
Я пытаюсь переопределить стиль управления по умолчанию в приложении 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
Кнопки во время выполнения приложения
Проблема может заключаться в том, что у вас есть какой-то другой стиль, который применяется к некоторому вложенному элементу управления вашей кнопки (например, 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>
Вероятно, есть более элегантные способы сделать это, но я не мог придумать ничего другого на данный момент.
Я отредактировал свой ответ, чтобы добавить возможное решение. Я надеюсь, что это помогает.
Спасибо за Ваш ответ. Есть ли способ добиться этого, внеся изменения в стиль или шаблон? Я не хочу менять все кнопки пользовательского интерфейса. :( Я пытаюсь создать тему для приложения.
Если вы уверены, что на ваших кнопках будет только текст, вы можете применить предложенное мной решение непосредственно в ControlTemplate
, которое вы определили в Style
. Это не очень хорошее решение, но оно должно работать, пока кто-то другой не предложит лучший подход.
Спасибо за ваш ответ. Не могли бы вы предложить какое-либо решение? Как этого добиться, когда у нас есть этот сценарий (два стиля для изменения стиля управления по умолчанию (кнопка и текстовый блок вместе))?