В коде позади как я могу переопределить цвета tabitem, установленные темой всего приложения? - PullRequest
1 голос
/ 28 июля 2011

Я изменяю цвет фона моего TabItem условно в коде позади.Это прекрасно работает, если в App.xaml не установлена ​​тема. Как я могу изменить цвета TabItem (в коде), сохраняя тему для всего приложения?

Фон:

Я использую бесплатную тему WPF из Nukeation Reuxables .Тема установлена ​​в разделе Application.Resources моего App.xaml:

<ResourceDictionary Source="/ReuxablesLegacy;component/Edge.xaml" />.

Я пытаюсь условно установить цвет фона TabItem в коде:

MyTabItem.Background = new SolidColorBrush(Colors.Gray);

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

Я знаю, что XAML и привязка обычно используются для изменения цвета, но решения, которые я пытался использовать, кажутся чрезмерносложный. Вот мой связанный вопрос StackOverflow , в котором мы ищем все XAML и связующее решение.Данные ответы только что подняли больше вопросов, на которые я не нашел ответов.

Заранее спасибо.

Редактировать:

Проблема не происходит при изменении фона кнопки:

button1.Background = new SolidColorBrush(Colors.Red);

Кнопка меняет цвет, как и ожидалось (при использовании темы всего приложения).

Ответы [ 3 ]

0 голосов
/ 28 июля 2011

Если вы посмотрите на ControlTemplate из TabItem, его свойство Background привязано к внутреннему ресурсу, который он не делает TemplateBinding, я предполагаю, что тема только что дала ему цвета.Для того, чтобы ваш код работал, вы должны изменить его стиль.

 <Style TargetType="{x:Type TabItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type TabItem}">
                            <Grid>
                                <Border 
                Name="Border"
                Margin="0,0,-4,0" 
                Background="{TemplateBinding Background}"
                BorderBrush="{StaticResource SolidBorderBrush}" 
                BorderThickness="1,1,1,1" 
                CornerRadius="2,12,0,0" >
                                    <ContentPresenter x:Name="ContentSite"
                  VerticalAlignment="Center"
                  HorizontalAlignment="Center"
                  ContentSource="Header"
                  Margin="12,2,12,2"
                  RecognizesAccessKey="True"/>
                                </Border>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="Panel.ZIndex" Value="100" /> 
                                    <Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0" />
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="False">
                                    <Setter TargetName="Border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}" />
                                    <Setter TargetName="Border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}" />
                                    <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

Я сделал два изменения в обычном ControlTemplate , вы можете сделать то же самое с вашей темой. Xaml.

  • Изменено Background="{StaticResource LightBrush}" наBackground="{TemplateBinding Background}"
  • Удалено Background установщик в IsSelected = Истинный триггер.
0 голосов
/ 29 июля 2011

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

Вместо того, чтобы пытаться изменить цвет фона TabItem, я просто меняю цвет переднего плана TabItem на Серый, если данных НЕТ.Я также добавляю слово «Пробел», например: «Пробел вкладки 1», «Пробел вкладки 2» и т. Д. Это эффективное решение исходной проблемы. Я опишу это подробно здесь.

0 голосов
/ 28 июля 2011

Это ДЕЙСТВИТЕЛЬНО зависит от того, как реализована сама тема. Если тема использовала TemplateBinding для привязки к цвету фона вкладки к элементам управления темы, тогда ваш код для решения будет работать. Это вероятно , почему ваша кнопка правильно меняет цвета фона в вашем примере.

Вам, вероятно, придется глубоко вникнуть в стиль xaml вкладки и сначала изменить его там, чтобы решение codebehind работало.

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