2016-04-04 2 views
2

Как установить шрифт по умолчанию для TextBox?TextBox установить шрифт по умолчанию

Для TextBlock это (взято из here):

TextBlock.FontFamilyProperty.OverrideMetadata(typeof(TextBlock), 
    new FrameworkPropertyMetadata(new FontFamily("Verdana"))); 

Попытка сделать то же самое для TextBox:

TextBox.FontFamilyProperty.OverrideMetadata(typeof(TextBox), 
    new FrameworkPropertyMetadata(new FontFamily("Verdana"))); 

выбросит:

Исключение брошено: «System. Windows.Markup.XamlParseException 'в PresentationFramework.dll

Дополнительная информация: Инициализатор типа для 'System.Windows.Controls.TextBox' выдал исключение. PropertyMetadata уже зарегистрирован для типа TextBox.


Вот репродукция:

<StackPanel> 
    <TextBlock Text="123123" /> 
    <TextBox Text="123123" BorderThickness="0" Padding="-2,0,-2,0" /> 
</StackPanel> 

Установка TextBlock шрифта, как описано выше в окне конструктора (до InitializeComponent()) работает. Как установить TextBox шрифт по умолчанию (по умолчанию это Segoe)? Мне нужно решение, чтобы установить его как "Verdana" в одном месте для целого приложения.


Intellisense показывает:

TextBlock

TextBox

+0

Вызов OverrideMetadata для типа рамки (например, TextBlock) в любом случае сомнительна. Вы должны установить значения по умолчанию с помощью стилей. – Clemens

+0

Я попытался установить 'TextElement', он ничего не работает. Установка «TextBlock» работает, но только для «TextBlock». – Sinatr

+0

Вы пробовали 'OverrideMetadata (Type, PropertyMetadata, DependencyPropertyKey)' версию с 'DependencyPropertyKey' – bars222

ответ

2

Вы можете изменить TextBox к TextBoxBase. Как-то это сработало для меня.

TextBoxBase.FontFamilyProperty.OverrideMetadata(typeof(TextBoxBase), 
       new FrameworkPropertyMetadata(new FontFamily("Verdana"))); 
+0

VS15 предлагает использовать 'Control. ... typeof (TextBoxBase) '. Как ни странно, что комбо работает (и мне оно больше, чем 'app.xaml'), большое спасибо, я никогда не догадывался. – Sinatr

+0

Добро пожаловать. Спасибо за изменение шрифтов в приложении (для полезного вопроса). – bars222

1

Для всего приложения, вы можете установить его в App.xaml:

<Application.Resources> 
    <Style TargetType="TextBox"> 
     <Setter Property="FontFamily" Value="Verdana" /> 
     <Setter Property="FontSize" Value="50"></Setter> 
    </Style> 

    <Style TargetType="TextBlock"> 
     <Setter Property="FontFamily" Value="Verdana" /> 
     <Setter Property="FontSize" Value="100"></Setter> 
    </Style> 
</Application.Resources> 

Для отдельных файлов, вам может установить это в XAML после вашего окна или открытие UserResource тег:

<Window.Resources> 
    <Style TargetType="TextBlock"> 
     <Setter Property="FontFamily" Value="Verdana" /> 
    </Style> 
</Window.Resources> 

Или, если это «UserControl» заменить «окно» с «UserControl» - Вы получаете идею.

Ваш основной формат будет выглядеть следующим образом:

<Window x:Class="WpfApplicationTestApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
    <Style TargetType="TextBlock"> 
     <Setter Property="FontFamily" Value="Verdana" /> 
    </Style> 
</Window.Resources> 

    <Grid> 
     <StackPanel> 
      <TextBlock Text="123123" /> 
      <TextBox Text="123123" BorderThickness="0" Padding="-2,0,-2,0" /> 
     </StackPanel> 
    </Grid> 
</Window> 

Удачи!

+0

У меня есть 20 окон и 50 пользовательских элементов управления, было бы неплохо установить значения по умолчанию в одном месте. Ваш пример работает ** только ** для 'TextBlock' (стиль шрифта TextBox по-прежнему« Segoe »). Я могу изменить «TargetType» на «TextBox», а затем он будет работать только для «TextBox». Установки обоих кажутся только применимыми к первому определенному стилю. Веселая. – Sinatr

+0

@Sinatr - вы можете установить его глобально в App.xaml. – Kiel

+0

Кроме того, FontSize, нацеленный на TextBlock, также влияет на кнопки (во время выполнения, а не в Studio) ...?!? – T4NK3R

0

Моя проблема не в том, чтобы установить TextBox только стиль (извините за пропущенную кнопку), но установив его вместе с TextBlock.

Проблема связана с тем, что эти элементы управления не имеют общего базового класса для наследования FontFamilyProperty. TextBox берет один от TextBoxBase и TextBlock от себя. Попытка установить оба из кода (окна) или окна xaml приведет либо к исключению, либо ни к чему (не будет работать для обоих).

трюк это установить его в ресурсах приложения, не спрашивайте меня, почему, но это работает, то (и работает для всего):

<Application.Resources> 
    <Style TargetType="TextBox"> 
     <Setter Property="FontFamily" Value="Verdana" /> 
    </Style> 
    <Style TargetType="TextBlock"> 
     <Setter Property="FontFamily" Value="Verdana" /> 
    </Style> 
    <!-- not sure if this make sense --> 
    <Style TargetType="TextElement"> 
     <Setter Property="FontFamily" Value="Verdana" /> 
    </Style> 
</Application.Resources> 

После также работает (спасибо @bars222's answer):

// font overrides 
TextElement.FontFamilyProperty.OverrideMetadata(typeof(TextElement), 
    new FrameworkPropertyMetadata(new FontFamily("Verdana"))); 
TextBlock.FontFamilyProperty.OverrideMetadata(typeof(TextBlock), 
    new FrameworkPropertyMetadata(new FontFamily("Verdana"))); 
Control.FontFamilyProperty.OverrideMetadata(typeof(TextBoxBase), 
    new FrameworkPropertyMetadata(new FontFamily("Verdana"))); 
Смежные вопросы