我手边有一个大项目,涉及大量的视图和用户控件。另外,我想将每个元素的FontFamily设置为某种字体。
这适用于大多数用户控件,如textBlocks,按钮和标签。遗憾的是,这不适用于textBoxes。它们保持不变。
在创建整个GUI之前,我将覆盖包含文本的元素的大部分元数据:
TextElement.FontFamilyProperty.OverrideMetadata(typeof(TextElement),
new FrameworkPropertyMetadata(new FontFamily("Calibri")));
TextBlock.FontFamilyProperty.OverrideMetadata(typeof(TextBlock),
new FrameworkPropertyMetadata(new FontFamily("Calibri")));
经过一番搜索后,我发现本文使用的方法相同:http://blog.davidpadbury.com/
最后明确指出:
“在上面的图片中,你会看到我们已成功更改文本块,标签和按钮上的字体。不幸的是,TextBox中的字体保持不变,这是因为它从它的基础接收它的FontFamily属性class Control.Control将自身添加为TextElement FontFamilyProperty的所有者,但指定它自己的元数据,然后我们无法覆盖它。“
它还建议创建一个控件模板,然后设置fontFamily。还有另外一种方法吗?我想在开始时以编程方式设置fontFamily,而不使用XAML或创建controlTemplate并将其用作每个textBox的基本模板。
提前致谢。
答案 0 :(得分:2)
您可以在没有Style
属性的情况下声明x:Key
,它将适用于该类型的所有控件:
<Style TargetType="{x:Type Control}">
<Setter Property="FontFamily" Value="Calibri" />
</Style>
或者,您可以在MainWindow
定义上设置此项,这将影响大多数元素:
<Window TextElement.FontFamily="Calibri" ...>
...
</Window>
啊......我刚刚注意到你使用xaml 不的情况......对不起,我第一次看得更近了。
更新&gt;&gt;&gt;
经过一番研究后,您似乎可以在这样的代码中执行此操作:
Style style = new Style(typeof(TextBlock));
Setter setter = new Setter();
setter.Property = TextElement.FontFamilyProperty;
setter.Value = new FontFamily("Calibri");
style.Setters.Add(setter);
Resources.Add(typeof(TextBlock), style);
不幸的是,您还必须为其他类型的控件执行其他Style
。
更新2&gt;&gt;&gt;
我只想到了一些事情......之前的例子只是将Style
设置为本地Resources
部分,这将超出其他模块的范围。您可以尝试将Style
设置为具有全局范围的Application.Resources
部分。尝试将上面代码示例的最后一行替换为:
App.Current.Resources.Add(typeof(TextBlock), style);