I'm building a WPF application that will be running on laptops mounted in police cars. The colors need to change when a user clicks on a button, one set of colors for Day time and another set for Night time. The idea is that the night time colors will be easier on the user's eyes in a dark police car at night.
I've implemented themes in my application. I use them to switch between "Day Time" colors and "Night Time" colors. This is done by switching between two different ResourceDictionaries, one for Day Time and one for Night Time.
I'm using a RadTabControl in my application and I cannot get its headerr to swap colors at all. Using Expression Blend, I've made a copy of the RadTabControl's template. Using Snoop, I inspected my program's visual tree and found that changing the background color of the Border control named "HeaderBackground" would change the background color of the header row. So I edited the copy of the RadTabControl's template and put my values into the template for that control, as shown below:
This does not have the desired effect, however. It appears that the {DynamicResource xxx} values I've specified are overridden somewhere, because every time I run the program and change to night mode, the colors do not change.
What am I doing wrong here? What is the correct way to do what I want to do? Here's the XAML for the RadTabControl in my program:
I've implemented themes in my application. I use them to switch between "Day Time" colors and "Night Time" colors. This is done by switching between two different ResourceDictionaries, one for Day Time and one for Night Time.
I'm using a RadTabControl in my application and I cannot get its headerr to swap colors at all. Using Expression Blend, I've made a copy of the RadTabControl's template. Using Snoop, I inspected my program's visual tree and found that changing the background color of the Border control named "HeaderBackground" would change the background color of the header row. So I edited the copy of the RadTabControl's template and put my values into the template for that control, as shown below:
<Style TargetType="{x:Type telerik:RadTabControl}"> <Setter Property="MinWidth" Value="5" /> <Setter Property="MinHeight" Value="26" /> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> <Setter Property="VerticalContentAlignment" Value="Stretch" /> <Setter Property="IsTabStop" Value="False" /> <Setter Property="BorderBrush" Value="{DynamicResource TabBorder}" /> <Setter Property="BorderThickness" Value="1,0,1,1" /> <Setter Property="Background" Value="{DynamicResource TabBackground}" /> <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <Telerik_Windows_Controls_Primitives:TabWrapPanel IsItemsHost="True" /> </ItemsPanelTemplate> </Setter.Value> </Setter> <Setter Property="DropDownButtonStyle"> <Setter.Value> <Style TargetType="{x:Type ToggleButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Grid> <Border x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"> <Border x:Name="InnerBorder" BorderBrush="White" BorderThickness="1" /> </Border> <Border x:Name="CheckedVisual" BorderBrush="#FFFFC92B" BorderThickness="{TemplateBinding BorderThickness}" Opacity="0"> <Border.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FFFFDCAB" Offset="0" /> <GradientStop Color="#FFFFD18F" Offset="0.5" /> <GradientStop Color="#FFFE9227" Offset="0.5" /> <GradientStop Color="#FFFFD74E" Offset="1" /> </LinearGradientBrush> </Border.Background> <Border BorderBrush="White" BorderThickness="1" /> </Border> <ContentPresenter x:Name="ContentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="Center" Margin="{TemplateBinding Padding}" VerticalAlignment="Center" /> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="BorderBrush" TargetName="Border" Value="#FFFFC92B" /> <Setter Property="BorderBrush" TargetName="InnerBorder" Value="White" /> <Setter Property="Background" TargetName="Border"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FFFFFBDA" Offset="0" /> <GradientStop Color="#FFFEEBAE" Offset="0.5" /> <GradientStop Color="#FFFFD25A" Offset="0.5" /> <GradientStop Color="#FFFFFBA3" Offset="1" /> </LinearGradientBrush> </Setter.Value> </Setter> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="BorderBrush" TargetName="Border"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF282828" /> <GradientStop Color="#FF5F5F5F" Offset="1" /> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="BorderBrush" TargetName="InnerBorder"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FFB69A78" /> <GradientStop Color="#FFFFE17A" Offset="0.126" /> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="Background" TargetName="Border"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FFFFDCAB" Offset="0" /> <GradientStop Color="#FFFFD18F" Offset="0.5" /> <GradientStop Color="#FFFE9227" Offset="0.5" /> <GradientStop Color="#FFFFBA74" Offset="0" /> </LinearGradientBrush> </Setter.Value> </Setter> </Trigger> <Trigger Property="IsChecked" Value="True"> <Setter Property="Opacity" TargetName="CheckedVisual" Value="1" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <Setter Property="Content" Value="" /> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <Path Data="M0,0L6,0 6,1 0,1 M0,2L6,2 6,3 5,3 5,4 4,4 4,5 2,5 2,4 1,4 1,3 0,3 0,2" Fill="Black" SnapsToDevicePixels="True" /> </DataTemplate> </Setter.Value> </Setter> <Setter Property="Padding" Value="5,3" /> <Setter Property="telerik:RadDockPanel.Dock" Value="Right" /> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="White" Offset="0" /> <GradientStop Color="Gainsboro" Offset="0.5" /> <GradientStop Color="#FFADADAD" Offset="0.5" /> <GradientStop Color="#FFD4D4D4" Offset="1" /> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="BorderBrush" Value="#FF848484" /> <Setter Property="BorderThickness" Value="1" /> <Setter Property="IsTabStop" Value="False" /> </Style> </Setter.Value> </Setter> <Setter Property="DropDownStyle"> <Setter.Value> <Style TargetType="{x:Type Telerik_Windows_Controls_TabControl:DropDownMenu}"> <Setter Property="Background" Value="White" /> <Setter Property="VerticalContentAlignment" Value="Center" /> <Setter Property="BorderThickness" Value="1" /> <Setter Property="MaxHeight" Value="500" /> <Setter Property="BorderBrush" Value="#FF848484" /> <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <telerik:RadWrapPanel IsItemsHost="True" Orientation="Vertical" /> </ItemsPanelTemplate> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Telerik_Windows_Controls_TabControl:DropDownMenu}"> <Grid> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"> <Border BorderBrush="#FF848484" BorderThickness="0,2,0,0"> <ItemsPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> </Border> </Border> <Rectangle x:Name="BorderMaskElement" Fill="Transparent" HorizontalAlignment="Left" VerticalAlignment="Top" /> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> </Setter.Value> </Setter> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type telerik:RadTabControl}"> <Grid> <telerik:RadDockPanel LastChildFill="True"> <telerik:LayoutTransformControl x:Name="HeaderDockedElement" telerik:RadDockPanel.Dock="Top" IsTabStop="False"> <Grid> <Border Background="{DynamicResource TabHeaderBackground}" BorderBrush="{DynamicResource TabBorder}" x:Name="HeaderBackground" Visibility="{TemplateBinding BackgroundVisibility}" /> <Border Background="{DynamicResource TabHeaderBackground}" BorderBrush="{DynamicResource TabBorder}" BorderThickness="0,0,0,1" SnapsToDevicePixels="True" /> <telerik:RadDockPanel Panel.ZIndex="10"> <ToggleButton x:Name="DropDownButtonElement" ClickMode="Press" telerik:RadDockPanel.Dock="Right" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Margin="2,4,4,2" Style="{TemplateBinding DropDownButtonStyle}" Visibility="Collapsed"> <telerik:RadContextMenu.ContextMenu> <Telerik_Windows_Controls_TabControl:DropDownMenu x:Name="DropDownMenuElement" ClickToOpen="True" DisplayMemberPath="{TemplateBinding DropDownDisplayMemberPath}" ItemTemplate="{TemplateBinding ItemDropDownContentTemplate}" Placement="Bottom" Style="{TemplateBinding DropDownStyle}" StaysOpen="False" /> </telerik:RadContextMenu.ContextMenu> </ToggleButton> <RepeatButton x:Name="LeftScrollButtonElement" Margin="4,4,2,2" Visibility="{Binding ComputedHorizontalScrollBarVisibility, ElementName=ScrollViewerElement}"> <RepeatButton.Style> <Style TargetType="{x:Type RepeatButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RepeatButton}"> <Grid> <Border x:Name="ButtonBorder"> <Grid> <Telerik_Windows_Controls_Chromes:ButtonChrome x:Name="ButtonVisual" BorderBrush="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" BorderThickness="1" Background="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}" CornerRadius="2,0,0,2" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderEnabled="{TemplateBinding IsEnabled}"> <telerik:StyleManager.Theme> <telerik:Office_BlackTheme /> </telerik:StyleManager.Theme> </Telerik_Windows_Controls_Chromes:ButtonChrome> <Path x:Name="Path" Data="F1M110.692,342.252L110.692,352.682 104.594,347.467 110.692,342.252z" Fill="Black" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Height="7" Margin="{TemplateBinding Padding}" Stretch="Uniform" SnapsToDevicePixels="True" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Width="5" /> </Grid> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True" /> <Trigger Property="IsPressed" Value="True" /> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Opacity" TargetName="ButtonBorder" Value="0" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <Setter Property="Width" Value="17" /> <Setter Property="Content" Value="" /> <Setter Property="Padding" Value="5,1" /> <Setter Property="Margin" Value="2" /> <Setter Property="telerik:RadDockPanel.Dock" Value="Left" /> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="White" Offset="0" /> <GradientStop Color="Gainsboro" Offset="0.5" /> <GradientStop Color="#FFADADAD" Offset="0.5" /> <GradientStop Color="#FFD4D4D4" Offset="1" /> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="BorderBrush" Value="#FF848484" /> <Setter Property="IsTabStop" Value="False" /> </Style> </RepeatButton.Style> </RepeatButton> <RepeatButton x:Name="RightScrollButtonElement" telerik:RadDockPanel.Dock="Right" Margin="2,4,2,2" Visibility="{Binding ComputedHorizontalScrollBarVisibility, ElementName=ScrollViewerElement}"> <RepeatButton.Style> <Style TargetType="{x:Type RepeatButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type RepeatButton}"> <Grid> <Border x:Name="ButtonBorder"> <Grid> <Telerik_Windows_Controls_Chromes:ButtonChrome x:Name="ButtonVisual" BorderBrush="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" BorderThickness="1" Background="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}" CornerRadius="0,2,2,0" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderEnabled="{TemplateBinding IsEnabled}"> <telerik:StyleManager.Theme> <telerik:Office_BlackTheme /> </telerik:StyleManager.Theme> </Telerik_Windows_Controls_Chromes:ButtonChrome> <Path x:Name="Path" Data="M0.5,0.5L5.2,5.4 5.2,5.4 0.5,10.5z" Fill="Black" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Height="7" Margin="{TemplateBinding Padding}" Stretch="Uniform" SnapsToDevicePixels="True" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Width="5" /> </Grid> </Border> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True" /> <Trigger Property="IsPressed" Value="True" /> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Visibility" TargetName="ButtonBorder" Value="Collapsed" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> <Setter Property="Width" Value="17" /> <Setter Property="Content" Value="" /> <Setter Property="Padding" Value="5,1" /> <Setter Property="Margin" Value="2" /> <Setter Property="telerik:RadDockPanel.Dock" Value="Left" /> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="White" Offset="0" /> <GradientStop Color="Gainsboro" Offset="0.5" /> <GradientStop Color="#FFADADAD" Offset="0.5" /> <GradientStop Color="#FFD4D4D4" Offset="1" /> </LinearGradientBrush> </Setter.Value> </Setter> <Setter Property="BorderBrush" Value="#FF848484" /> <Setter Property="IsTabStop" Value="False" /> </Style> </RepeatButton.Style> </RepeatButton> <ScrollViewer x:Name="ScrollViewerElement" BorderThickness="0" HorizontalScrollBarVisibility="{Binding (ScrollViewer.HorizontalScrollBarVisibility), RelativeSource={RelativeSource TemplatedParent}}" IsTabStop="False" Margin="2,4,2,0" VerticalScrollBarVisibility="Disabled"> <ScrollViewer.Style> <Style TargetType="{x:Type ScrollViewer}"> <Setter Property="HorizontalContentAlignment" Value="Left" /> <Setter Property="VerticalContentAlignment" Value="Top" /> <Setter Property="Padding" Value="0" /> <Setter Property="BorderThickness" Value="0" /> <Setter Property="BorderBrush" Value="Transparent" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ScrollViewer}"> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"> <Grid Background="{TemplateBinding Background}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <ScrollContentPresenter x:Name="ScrollContentPresenter" Cursor="{TemplateBinding Cursor}" CanHorizontallyScroll="False" CanVerticallyScroll="False" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}" /> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </ScrollViewer.Style> <ItemsPresenter /> </ScrollViewer> </telerik:RadDockPanel> </Grid> </telerik:LayoutTransformControl> <Border x:Name="ContentBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"> <Grid> <ContentPresenter x:Name="ContentElement" ContentTemplate="{TemplateBinding SelectedContentTemplate}"> <ContentPresenter.Visibility> <Binding Path="IsContentPreserved" RelativeSource="{RelativeSource TemplatedParent}"> <Binding.Converter> <telerik:InvertedBooleanToVisibilityConverter /> </Binding.Converter> </Binding> </ContentPresenter.Visibility> </ContentPresenter> <Grid x:Name="ContentElementsPanel"> <Grid.Visibility> <Binding Path="IsContentPreserved" RelativeSource="{RelativeSource TemplatedParent}"> <Binding.Converter> <telerik:BooleanToVisibilityConverter /> </Binding.Converter> </Binding> </Grid.Visibility> </Grid> </Grid> </Border> </telerik:RadDockPanel> </Grid> <ControlTemplate.Triggers> <Trigger Property="DropDownDisplayMode" Value="Visible"> <Setter Property="Visibility" TargetName="DropDownButtonElement" Value="Visible" /> </Trigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="DropDownDisplayMode" Value="WhenNeeded" /> <Condition Property="ComputedHorizontalScrollBarVisibility" SourceName="ScrollViewerElement" Value="Visible" /> </MultiTrigger.Conditions> <Setter Property="Visibility" TargetName="DropDownButtonElement" Value="Visible" /> </MultiTrigger> <Trigger Property="TabStripPlacement" Value="Left"> <Setter Property="telerik:RadDockPanel.Dock" TargetName="HeaderDockedElement" Value="Left" /> <Setter Property="LayoutTransform" TargetName="HeaderDockedElement"> <Setter.Value> <RotateTransform Angle="-90" /> </Setter.Value> </Setter> <Setter Property="BorderThickness" Value="0,1,1,1" /> </Trigger> <Trigger Property="TabStripPlacement" Value="Right"> <Setter Property="telerik:RadDockPanel.Dock" TargetName="HeaderDockedElement" Value="Right" /> <Setter Property="LayoutTransform" TargetName="HeaderDockedElement"> <Setter.Value> <RotateTransform Angle="90" /> </Setter.Value> </Setter> <Setter Property="BorderThickness" Value="1,1,0,1" /> </Trigger> <Trigger Property="TabStripPlacement" Value="Bottom"> <Setter Property="telerik:RadDockPanel.Dock" TargetName="HeaderDockedElement" Value="Bottom" /> <Setter Property="LayoutTransform" TargetName="HeaderDockedElement"> <Setter.Value> <RotateTransform Angle="180" /> </Setter.Value> </Setter> <Setter Property="BorderThickness" Value="1,1,1,0" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> This does not have the desired effect, however. It appears that the {DynamicResource xxx} values I've specified are overridden somewhere, because every time I run the program and change to night mode, the colors do not change.
What am I doing wrong here? What is the correct way to do what I want to do? Here's the XAML for the RadTabControl in my program:
<telerik:RadTabControl Background="{DynamicResource ContentBackground}" FontSize="22" FontWeight="Bold" Grid.Column="0" Name="OperationsTabs" SelectionChanged="Tabs_SelectionChanged" Visibility="Collapsed"> <telerik:RadTabItem . . . /> </telerik:RadTabControl>