Как установить шрифт по умолчанию для приложения WPF?
Я хочу, чтобы определить семейство шрифтов для моего приложения WPF. Предпочтительно использовать ресурсный словарь в качестве темы, на которую ссылается App.xaml
. Я попытался создать Style
следующим образом:
<Style TargetType="{x:Type Control}">
<Setter Property="FontFamily" Value="Segoe UI" />
</Style>
Но это не работает. Установка типа TextBlock
работает для большинства элементов управления, но есть несколько элементов управления, где это не применяется.
Я знаю, что вы можете установить шрифт в окне, и все дочерние элементы управления этого окна наследуют шрифт. Но я думаю, что любое диалоговое окно вернется к шрифту по умолчанию, что не совсем то, что я хочу.
Любые идеи?
Ответы
Ответ 1
Предполагая, что подклассы Window
не переопределяют DefaultStyleKey
, вы можете просто добавить его в свой стиль Window, так как TextElement.FontFamilyProperty
является наследуемым свойством:
<Style TargetType="{x:Type Window}">
<Setter Property="FontFamily" Value="Segoe UI" />
</Style>
Вам также необходимо добавить следующее в конструктор App после вызова InitializeComponent
:
FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata
{
DefaultValue = FindResource(typeof(Window))
});
Как это работает: после завершения инициализации объекта App, стиль Window, указанный в нем, становится стандартным для всех окон.
Ответ 2
Большинство предлагаемых решений для меня не работало. Мое простое решение:
Добавьте это в App.xaml:
<Style TargetType="{x:Type Window}">
<Setter Property="FontSize"
Value="14" />
</Style>
Добавьте это в свой конструктор MainWindow (после InitializeComponent):
Style = (Style)FindResource(typeof(Window));
Ответ 3
Я нашел это:
TextElement.FontFamilyProperty.OverrideMetadata(
typeof(TextElement),
new FrameworkPropertyMetadata(
new FontFamily("Comic Sans MS")));
TextBlock.FontFamilyProperty.OverrideMetadata(
typeof(TextBlock),
new FrameworkPropertyMetadata(
new FontFamily("Comic Sans MS")));
Ответ 4
Один простой способ сделать это программно:
public MainWindow()
{
this.FontFamily = new FontFamily("Segoe UI");
}
Ответ 5
Попробуйте это обходное решение в App.xaml
(без необходимости кода):
<SolidColorBrush x:Key="ForeBrush" Color="Blue" />
<Style x:Key="GenericTextStyle">
<!-- Generic control forecolor definition -->
<Setter Property="Control.Foreground" Value="{StaticResource ForeBrush}" />
<!-- Add a definition for each unworking nested control -->
<Style.Resources>
<Style TargetType="{x:Type Label}">
<Setter Property="Foreground" Value="{StaticResource ForeBrush}" />
</Style>
</Style.Resources>
</Style>
Просто привяжите стиль Windows к этому. Прекрасно подходит для меня. В вложенном дереве должны быть определены только некоторые свойства. Например, свойство FontSize
можно указать только в общем разделе.
Я не знаю, зачем нужно делать этот трюк. Это странно, потому что Label следует вывести из Control. Кто-нибудь знает об этом?