在Silverlight 4 Beta中将FontFamily应用于所有控件

6

我希望在Silverlight 4.0中为每个Control指定特定的FontFamilyFontWeight。我知道现在可以使用样式应用于某种类型的所有控件,因此我尝试了以下代码:

<Style TargetType="Control">
    <Setter Property="FontFamily" Value="Arial" />
    <Setter Property="FontWeight" Value="Bold" />
</Style>

很遗憾,这似乎不起作用。然而,对于那些派生自Control的类型,我是可以做到的。例如,将TargetType设置为Button会将这些值应用于我的应用程序中的每个Button
那么,为什么我不能这样做基于Control基类的类型呢?
3个回答

5
控件样式与类型系统的绑定可能有点误导人。实际上,它是基于控件的DefaultStyleKey属性值。对于一个Button,这个值是typeof(Button),而对于一个TextBox,它是typeof(Textbox)。
如果TargetType值等于控件的DefaultStyleKey值,那么将应用默认样式到控件上。不会检查DefaultStyleKey中的Type是否是TargetType的派生类。
字体相关属性是一种特殊情况,因为大多数控件将从包含上下文中继承字体属性的值。因此,您可以通过在UserControl元素上指定FontFamily和FontWeight来有效地实现相同的结果。
编辑
来自OP的评论:
我希望我可以在一个地方设置它,并让整个应用程序中的每个UserControl都采用该样式。
你能做到的最接近的方法是在应用程序资源中放置一个有键样式,并确保所有的UserControl都绑定到该样式。当然,这仍然需要每个UserControl的合作,但至少字体选择保留在一个地方。
例如,在app.xaml中:
<Style x:Key="Common" TargetType="UserControl">
    <Setter Property="FontFamily" Value="Arial" />
    <Setter Property="FontWeight" Value="Bold" />
<Setter Property="Foreground" Value="Blue" />

然后在每个用户控件中:-
<UserControl ...namespace stuff here...
   Style="{StaticResource Common}">
  <!-- ... content here ... -->

谢谢,这很有道理。虽然我希望我可以在一个地方设置它,并让整个应用程序中的每个UserControl都采用该样式。不过我想我可以创建一个自定义的UserControl来作为其他控件的基础。 - David Brown

1

这会很有帮助:

this.RootVisual = New MainPage();
(MainPage)this.RootVisual.FontFamily 
  = New System.Windows.Media.FontFamily(
    "/SLApplication;component/Fonts/segoeui.ttf#Segoe UI");

1

我是通过在根视觉中指定FontFamily来实现的。所有没有显式设置FontFamily的子控件都从根视觉派生FontFamily。

只有ChildWindow需要额外的FontFamily设置,因为它托管在“超级”根视觉中(作为弹出窗口)。


你用什么XAML进行设置?根视觉元素不接受样式。 - Todd Main

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接