重写类库中的系统控制样式
本文关键字:系统控制 样式 类库 重写 | 更新日期: 2023-09-27 17:49:18
你可以看到,在默认的Aero主题中,ListBoxItem
的样式真的很过时,所以我找到了一个新的样式,如果我把它放在MainWindow.Resources
中,它就会起作用。
但是如果我把它放在Themes/Aero.NormalColor.xaml
在一个类库和引用它(我也使用了一些自定义控件在该库),但它不起作用。有解决方法吗?(
ThemeInfo
for class library:
[assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)]
主项目ThemeInfo
:
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
Themes/Aero.NormalColor.xaml
:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- Hover Brushes -->
<LinearGradientBrush x:Key="HoverBackgroundBrushKey" StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#FCFCFC" Offset="0" />
<GradientStop Color="#EBF3FD" Offset="1" />
</LinearGradientBrush>
<SolidColorBrush x:Key="HoverOuterBorderBrushKey" Color="#B8D6FB" />
<SolidColorBrush x:Key="HoverInnerBorderBrushKey" Color="#F2F7FE" />
<!-- Selected (Active) Brushes -->
<LinearGradientBrush x:Key="SelectedActiveBackgroundBrushKey" StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#DCEBFC" Offset="0" />
<GradientStop Color="#C1DBFC" Offset="1" />
</LinearGradientBrush>
<SolidColorBrush x:Key="SelectedActiveOuterBorderBrushKey" Color="#7DA2CE" />
<SolidColorBrush x:Key="SelectedActiveInnerBorderBrushKey" Color="#EBF4FD" />
<!-- Selected (Inactive) Brushes -->
<LinearGradientBrush x:Key="SelectedInactiveBackgroundBrushKey" StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#F8F8F8" Offset="0" />
<GradientStop Color="#E5E5E5" Offset="1" />
</LinearGradientBrush>
<SolidColorBrush x:Key="SelectedInactiveOuterBorderBrushKey" Color="#D9D9D9" />
<SolidColorBrush x:Key="SelectedInactiveInnerBorderBrushKey" Color="#F0F0F0" />
<!-- ListBoxItem Style -->
<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="2,0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Grid>
<Border x:Name="outerBorder" Background="{TemplateBinding Control.Background}"
BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="2"
BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
<Border x:Name="innerBorder" Background="{TemplateBinding Background}"
BorderThickness="1" CornerRadius="1" Padding="{TemplateBinding Padding}"
SnapsToDevicePixels="True">
<ContentPresenter ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
ContentTemplateSelector=
"{TemplateBinding ContentControl.ContentTemplateSelector}"
ContentStringFormat=
"{TemplateBinding ContentControl.ContentStringFormat}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="outerBorder" Property="BorderBrush"
Value="{StaticResource HoverOuterBorderBrushKey}" />
<Setter TargetName="innerBorder" Property="Background"
Value="{StaticResource HoverBackgroundBrushKey}" />
<Setter TargetName="innerBorder" Property="BorderBrush"
Value="{StaticResource HoverInnerBorderBrushKey}" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="outerBorder" Property="BorderBrush"
Value="{StaticResource SelectedActiveOuterBorderBrushKey}" />
<Setter TargetName="innerBorder" Property="Background"
Value="{StaticResource SelectedActiveBackgroundBrushKey}" />
<Setter TargetName="innerBorder" Property="BorderBrush"
Value="{StaticResource SelectedActiveInnerBorderBrushKey}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True" />
<Condition Property="Selector.IsSelectionActive" Value="False" />
</MultiTrigger.Conditions>
<Setter TargetName="outerBorder" Property="BorderBrush"
Value="{StaticResource SelectedInactiveOuterBorderBrushKey}" />
<Setter TargetName="innerBorder" Property="Background"
Value="{StaticResource SelectedInactiveBackgroundBrushKey}" />
<Setter TargetName="innerBorder" Property="BorderBrush"
Value="{StaticResource SelectedInactiveInnerBorderBrushKey}" />
</MultiTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- Supporting TreeViewItem Resources -->
<PathGeometry x:Key="TreeArrow">
<PathGeometry.Figures>
<PathFigureCollection>
<PathFigure IsFilled="True" StartPoint="0 0" IsClosed="True">
<PathFigure.Segments>
<PathSegmentCollection>
<LineSegment Point="0 6" />
<LineSegment Point="6 0" />
</PathSegmentCollection>
</PathFigure.Segments>
</PathFigure>
</PathFigureCollection>
</PathGeometry.Figures>
</PathGeometry>
<Style x:Key="ExpandCollapseToggleStyle" TargetType="{x:Type ToggleButton}">
<Setter Property="Focusable" Value="False" />
<Setter Property="Width" Value="16" />
<Setter Property="Height" Value="16" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border Width="16" Height="16" Background="Transparent" Padding="5,5,5,5">
<Path x:Name="ExpandPath" Fill="Transparent" Stroke="#FF989898"
Data="{StaticResource TreeArrow}">
<Path.RenderTransform>
<RotateTransform Angle="135" CenterX="3" CenterY="3" />
</Path.RenderTransform>
</Path>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="ExpandPath" Property="Stroke" Value="#FF1BBBFA" />
<Setter TargetName="ExpandPath" Property="Fill" Value="Transparent" />
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="ExpandPath" Property="RenderTransform">
<Setter.Value>
<RotateTransform Angle="180" CenterX="3" CenterY="3" />
</Setter.Value>
</Setter>
<Setter TargetName="ExpandPath" Property="Fill" Value="#FF595959" />
<Setter TargetName="ExpandPath" Property="Stroke" Value="#FF262626" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- TreeViewItem Style -->
<Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="2,0" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TreeViewItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="19" Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<ToggleButton x:Name="expander" Style="{StaticResource ExpandCollapseToggleStyle}"
IsChecked=
"{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}"
ClickMode="Press" />
<Border x:Name="outerBorder" Grid.Column="1" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"
SnapsToDevicePixels="True">
<Border x:Name="innerBorder" Background="{TemplateBinding Background}"
BorderThickness="1" CornerRadius="1" Padding="{TemplateBinding Padding}"
SnapsToDevicePixels="True">
<ContentPresenter x:Name="PART_Header" ContentSource="Header"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
</Border>
<ItemsPresenter x:Name="itemsHost" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="False">
<Setter TargetName="itemsHost"
Property="Visibility"
Value="Collapsed" />
</Trigger>
<Trigger Property="HasItems" Value="False">
<Setter TargetName="expander" Property="Visibility" Value="Hidden" />
</Trigger>
<Trigger SourceName="outerBorder" Property="IsMouseOver" Value="True">
<Setter TargetName="outerBorder" Property="BorderBrush"
Value="{StaticResource HoverOuterBorderBrushKey}" />
<Setter TargetName="innerBorder" Property="Background"
Value="{StaticResource HoverBackgroundBrushKey}" />
<Setter TargetName="innerBorder" Property="BorderBrush"
Value="{StaticResource HoverInnerBorderBrushKey}" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="outerBorder" Property="BorderBrush"
Value="{StaticResource SelectedActiveOuterBorderBrushKey}" />
<Setter TargetName="innerBorder" Property="Background"
Value="{StaticResource SelectedActiveBackgroundBrushKey}" />
<Setter TargetName="innerBorder" Property="BorderBrush"
Value="{StaticResource SelectedActiveInnerBorderBrushKey}" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True" />
<Condition Property="Selector.IsSelectionActive" Value="False" />
</MultiTrigger.Conditions>
<Setter TargetName="outerBorder" Property="BorderBrush"
Value="{StaticResource SelectedInactiveOuterBorderBrushKey}" />
<Setter TargetName="innerBorder" Property="Background"
Value="{StaticResource SelectedInactiveBackgroundBrushKey}" />
<Setter TargetName="innerBorder" Property="BorderBrush"
Value="{StaticResource SelectedInactiveInnerBorderBrushKey}" />
</MultiTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
如果你想把这个'override'应用到应用程序中的所有ListBoxItem,去掉'x:Key="{x:Type ListBoxItem}"'
在窗口中。包含列表框的Xaml文件也必须合并该资源字典。
<Window.Resources>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="clr-namespace: [namespace_from_your_referenced_library]">
</ResourceDictionary.MergedDictionaries>
</Window.Resources>
也可以从库中合并资源到代码后面(.xaml.cs)
例如,在下一个代码中,我们合并应用程序级别的资源
ResourceDictionary res = new ResourceDictionary();
res.Source = new Uri("LIBRARYNAME;fullclassname" + ".xaml", UriKind.Relative);
try{
Application.Current.Resources.MergedDictionaries.Add(res);
}
catch {
// may be resource was loaded ?
}