2017-03-06 3 views
0

ich mehrere Tasten haben, wie folgt aus:Make wpf Schaltfläche Schriftarten zur Laufzeit entsprechen

<Button Name="btnContent" Grid.Column="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
       <Viewbox MaxWidth="100" StretchDirection="Both"> 
        <TextBlock Text="Content" ></TextBlock> 
       </Viewbox> 
      </Button> 

<Button Name="btnMoreContent" Grid.Column="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > 
       <Viewbox MaxWidth="100" StretchDirection="Both"> 
        <TextBlock Text="More Content" ></TextBlock> 
       </Viewbox> 
      </Button> 

Die Schriftart skaliert die Tasten passen. Wie kann ich die Textgröße/den Skalierungswert der Schaltfläche mit dem kleinsten Text zur Laufzeit erfassen und alle auf diese Größe einstellen? Ich habe versucht:

double FontSize = btnContentButton.FontSize; 
    if (FontSize < btnLongerContentButton.FontSize) 
      { 
       FontSize = btnLongerContentButton.FontSize; 
      } 

btnContentButton.FontSize = FontSize; 
btnLongerContentButton.FontSize = FontSize; 

Aber das funktioniert nicht, weil ich nie wirklich die Schriftgröße verändert - Er setzt sie alle bis 12.

+0

Wenn Sie die Schriftgröße beibehalten möchten, warum verwenden Sie dann Viewbox? Es ist nur Text drin. – Ron

+0

Der Text wird so skaliert, dass er in das Textfeld passt. Das funktioniert gut, aber es sieht ein bisschen albern aus, deshalb möchte ich, dass alle dieselbe Menge skalieren. –

+0

Der kürzere Text skaliert überhaupt nicht, weil es nicht benötigt wird, aber ich möchte, dass es genauso skaliert wie die Boxen mit dem längeren Text. –

Antwort

0

in this link die vorgeschlagenen Lösungen versuchen und sehen, ob sie lösen das Problem.

Allerdings können Sie diesen ein, um zu versuchen zu: Load-Ereignis Griff, finden alle TextBlock s mit Eltern vom Typ ViewBox (Sie können auch andere Bedingungen prüfen oder einstellen Eigennamen, weitere Probleme hier zu vermeiden), passen ihre Width, richtig auf der Grundlage der Width der mit der längsten Text:

private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     List<TextBlock> tbs = new List<TextBlock>(); 
     TextBlock longestText = null; 
     foreach (TextBlock t in FindVisualChildren<TextBlock>(this)) 
     { 
      if (t.Parent is Viewbox) 
      { 
       tbs.Add(t); 
       if (longestText == null) 
        longestText = t; 
       else if (t.Text.Length > longestText.Text.Length) 
        longestText = t; 
      } 
     } 
     double a = longestText.ActualWidth/longestText.ActualHeight; 
     foreach (TextBlock tb in tbs) 
     { 
      if (tb == longestText) 
       continue; 
      tb.Width = a * tb.ActualHeight; 
     } 

    } 

    public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
    { 
     if (depObj != null) 
     { 
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
      { 
       DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
       if (child != null && child is T) 
       { 
        yield return (T)child; 
       } 

       foreach (T childOfChild in FindVisualChildren<T>(child)) 
       { 
        yield return childOfChild; 
       } 
      } 
     } 
    } 

FindVisualChildren Methode aus here ist.

Ich hoffe, es hilft.

Verwandte Themen