WPF - переопределить унаследованный стиль для дочерних / внутренних элементов управления - PullRequest
1 голос
/ 04 апреля 2019

Так что этот конкретный ответ, кажется, частично работает: Сбросить унаследованный стиль WPF?

Однако, похоже, он не переопределяет стилизацию "внутренних" элементов. Например, если я установил для TextBlock Foreground красный в моем главном файле App.xaml, он изменит все элементы TextBlock, но также повлияет на элементы управления, которые имеют внутренние / шаблонные элементы управления, такие как текст элемента Button.

Когда я позже пытаюсь переопределить стиль, он влияет только на прямые элементы TextBlock. Кажется, что кнопки все еще используют стиль красного текста из App.xaml.

В приложении. Xaml:

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

Содержимое MainWindow.xaml (оба элемента управления отображают красный текст):

<StackPanel>
    <TextBlock>Hello World! I should be red!</TextBlock>
    <Button Click="Button_Click" Content="I'm red, too. Click me to open a new Popup!" />
</StackPanel>

Событие Button_Click:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var x = new Popup();
    x.Show();
}

и Popup.xaml:

<Window.Resources>
    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="Blue" />
    </Style>
</Window.Resources>
<StackPanel>
    <TextBlock>Hello World, I'm blue!</TextBlock>
    <Button Content="Oh no! I should be blue, too, but I'm red!" />
</StackPanel>

Результат: Screenshot showing the Popup window button having red text

Как сделать так, чтобы стиль в Popup.xaml имел такой же уровень воздействия, как и тот же стиль в App.xaml?

РЕДАКТИРОВАТЬ: я должен отметить, что реальная мотивация здесь в том, что я создаю плагины для корпоративного приложения. Базовое приложение имеет много стилей, которые переносятся в мои плагины, и я пытаюсь найти словарь ресурсов «сбросить все стили», но когда у меня есть такие вещи, как DataGrids, элементы содержимого не сбрасываются - они наследуют стили от базового приложения, и я пытаюсь найти эффективный способ их сброса, не будучи слишком явным.

1 Ответ

1 голос
/ 04 апреля 2019

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

Здесь вы можете найти информацию о приоритет свойства зависимостей .

Насколько я знаю, единственный способ не дать общему стилю, подобному этому, воздействовать на подэлементы, это явно стилизовать их.(Не очень хороший подход)

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