Невозможно переопределить стиль кнопки из app.xaml в WPF - PullRequest
1 голос
/ 29 мая 2019

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

ВЫПУСКА

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

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

Дополнительная информация: кнопки находятся в пользовательском контроле и загружены в ContentWontrol 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

enter image description here

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

enter image description here

1 Ответ

5 голосов
/ 29 мая 2019

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

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

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

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

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

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


EDIT

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

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

Возможно, есть более элегантные способы сделать это, но я не смог придумать что-либо еще вмомент.

...