2012-04-15 41 views
2

Alle meine Raster können klein und sehr groß sein, abhängig von der Fenstergröße, aber der Text im Inneren sieht bei großen Rastergrößen sehr klein aus.Ist es möglich, Schriftarten skalierbar zu machen?

Meine aktuelle Idee (aber ich weiß nicht, wie es noch zu erkennen) ist für alle Netzelemente einzelne Schrift zu machen und dann die Schriftgröße ändern, indem

override void OnRender(DrawingContext dc) { 

je nach Fenstergröße.

Die Frage ist: Ist diese Idee gesund und gibt es andere Methoden dafür?

+0

Haben Ihre Rasterelemente unterschiedliche Schriftgrößen? –

+0

für jetzt ich ihre Größen nicht angeben, aber mit den gleichen Schriftgrößen ist nicht unbedingt – Cynede

+1

Ich habe eine andere Lösung zu meiner Antwort hinzugefügt. –

Antwort

2

Wenn Sie die Schriftart nicht explizit für innere Elemente festgelegt haben, übernehmen sie die übergeordnete Schriftart. Sie können also die Schriftgröße für eines der übergeordneten Elemente ändern (z. B. Window selbst oder Grid). Dadurch wird die Schriftgröße aller inneren Elemente geändert, für die die Schriftgröße nicht explizit angegeben wurde.

Wenn Ihre Schriftart jedoch unterschiedliche Größen haben sollte, ist es meiner Meinung nach am besten, die Schriftgröße der Elemente an die Schriftgröße des übergeordneten Fensters zu binden und mit einem Wertkonverter eine Skalierung der Schriftgröße vorzunehmen:

Wert Konverter wie folgt definieren:

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(); 
     } 
    } 
} 

Und es in xAML verwenden:

<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 als scal verwendet wird e der Schriftart des Elements, die sich auf das Fenster bezieht (angegeben in ElementName Eigenschaft der Bindung).

In diesem Beispiel beträgt die Schriftart der ersten TextBlock 150% der Fensterschriftart und die Schriftart der zweiten TextBlock ist 70% des Fensters. Das dritte TextBlock folgt der Schriftgröße des Fensters.

0

Ich mag mehr diese Lösung wie von Roberther vorgeschlagen. Es ist mehr aesy und sauber.

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