2012-04-15 6 views
2

Все мои решетки могут быть маленькими и очень большими в зависимости от размера окна, но текст внутри выглядит действительно маленьким на больших размерах сетки.Можно ли сделать шрифты масштабируемыми?

Моя текущая идея (но я не знаю, как реализовать его еще), чтобы сделать обязательными для всех Грид элементов для одного шрифта, а затем изменить размер шрифта на

override void OnRender(DrawingContext dc) { 

в зависимости от размера окна.

Вопрос: Является ли эта идея здравомыслящей и есть ли другие методы для этого?

+0

Имеет ли ваши элементы сетки разные размеры шрифта? –

+0

на данный момент я не указываю их размеры, но с использованием одинаковых размеров шрифта необязательно – Cynede

+1

Я добавил еще одно решение для моего ответа. –

ответ

2

Если вы не задали шрифт на внутренних элементах явно, они наследуют родительский шрифт. Таким образом, вы можете изменить размер шрифта на одном из родительских элементов (например, Window или Grid). Это изменяет размер шрифта во всех внутренних элементах, которые явно не указали размер шрифта.

Однако, если ваш шрифт должен быть разных размеров, лучшим решением, на мой взгляд, является привязка размера шрифта к размеру шрифта родительского окна и использование преобразователя значений для масштабирования по размеру шрифта:

Определить преобразователь значений, как это:

using System; 
using System.Windows.Data; 

namespace WPFTest 
{ 
    public class FontSizeConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value == null) 
       return null; 
      double windowFontSize = (double)value; 
      var scale = System.Convert.ToDouble(parameter); 
      return windowFontSize * scale; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

И использовать его в XAML:

<Window x:Class="WPFTest.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:test="clr-namespace:WPFTest" 
     Title="Window1" Height="300" Width="300" FontSize="20" x:Name="window1"> 
    <Window.Resources> 
     <test:FontSizeConverter x:Key="fontSizeConverter"/> 
    </Window.Resources> 
    <Grid> 
     <StackPanel Grid.Row="0" Grid.Column="0"> 
      <TextBlock 
       FontSize="{Binding ElementName=window1, Path=FontSize, Converter={StaticResource ResourceKey=fontSizeConverter}, ConverterParameter=1.5}"> 
       Text 1 
      </TextBlock> 
      <TextBlock FontSize="{Binding ElementName=window1, Path=FontSize, Converter={StaticResource ResourceKey=fontSizeConverter}, ConverterParameter=0.7}"> 
       Text 2 
      </TextBlock> 
      <TextBlock >Text 3</TextBlock> 
     </StackPanel> 
    </Grid> 
</Window> 

ConverterParameter используется как бюджетная e шрифта элемента, связанного с окном (указано в свойстве ElementName).

В этом примере шрифт первого TextBlock составляет 150% от шрифта окна, а шрифт второго TextBlock - это 70% окна. Третий TextBlock следует размеру шрифта окна.

0

Мне больше нравится это решение, предложенное roberther. Это более есетично и чисто.

<Viewbox> 
    <TextBlock Text="Hello World" /> 
</Viewbox>