我有一个没有xaml部分的用户控件,它完全是用C#编写的,但Control模板是使用ResourceDictionary用xaml编写的,这主要是由于与命名用户控件有关的问题(http://devdump.wordpress.com/2010/02/24/cannot-set-name-attribute-value-error/ ),因此,控制模板在控件的构造函数中动态加载。
此控件类似于TabControl,它具有项目,每个项目都有Header和Content,因此使用控件模板(过滤掉内容并仅显示标题)。一切正常,但是当我现在在App.xaml中为TextBlock添加样式(FontSize)时我无法在本地更改FontSize,我甚至无法更改模板中的FontSize,它始终使用app中定义的那个。 XAML。如果我从app.xaml中删除该样式,一切正常。
我的全球风格看起来像(app.xaml):
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="14" />
<Setter Property="FontFamily" Value="Segoe UI" />
</Style>
我的模板是这样的:
<ControlTemplate x:Key="MyTemplate" TargetType="MyControl">
<StackPanel x:Name="mainStack" Background="Transparent">
<StackPanel Background="{TemplateBinding Background}" Orientation="Horizontal" TextBlock.Foreground="{TemplateBinding HeaderForeground}">
<Image Source="{TemplateBinding Source}" Margin="10, 0, 0, 0"/>
<ContentPresenter x:Name="contentPresenter" ContentSource="Header" Margin="{TemplateBinding Padding}"/>
</StackPanel>
</StackPanel>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{Binding Path=SelectedBackground, RelativeSource={RelativeSource Mode=Self}}" />
<Setter Property="Foreground" Value="{Binding Path=SelectedForeground, RelativeSource={RelativeSource Mode=Self}}" />
</Trigger>
<Trigger SourceName="mainStack" Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{Binding Path=HoverBrush, RelativeSource={RelativeSource Mode=Self}}"/>
<Setter Property="Cursor" Value="Hand"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
我用来从资源字典加载模板的代码是:
ResourceDictionary dic = new ResourceDictionary();
dic.Source = new Uri("mynamespace", UriKind.RelativeOrAbsolute);
this.Template = (ControlTemplate)dic["MyTemplate"];
因此,总而言之,无法更改TextBlock.FontSize,始终使用全局值,即使直接在模板本身中设置它也无法覆盖它。
以下是此问题的更新:
如果我有一个定义了TextBlock的UserControl,并且如果我想通过附加属性更改它的属性它将不起作用,仍然会应用全局样式,并且将忽略任何本地设置。
用户控制:
<UserControl x:Class="WpfApplication1.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBlock>Inside the user cotnrol TextBlock</TextBlock>
</Grid>
</UserControl>
主窗口:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1" x:Class="WpfApplication1.MainWindow"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<TextBlock FontSize="20" Text="Naked TextBlock"/>
<local:MyControl TextBlock.FontSize="20"/>
</StackPanel>
同样的全球风格:
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="14"/>
<Setter Property="FontFamily" Value="Segoe UI"/>
</Style>