在App.xaml中定义样式时,无法更改用户控件TextBlock.FontSize

时间:2014-06-23 23:24:36

标签: c# wpf

我有一个没有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>

0 个答案:

没有答案