2011-08-18 13 views
7

Mam blok tekstu z wymiarem szerokości = 511, wysokość = 159. FontSize = 28. Chcę zmienić rozmiar czcionki, jeśli tekst przekracza wymiar bloku tekstu, aby cały tekst był wyświetlany. Czy jest sposób na zrobienie tego? Może formuła?Zmień rozmiar czcionki, jeśli tekst przekracza granicę Textblock

+0

nie chcę używać ViewBox ponieważ oddala textblock podejmowania szerokość mniejszą. Chcę zachować wymiar bloku tekstu i zmienić rozmiar czcionki. – patlimosnero

+2

Oto podobny wpis, używając TextRenderer.MeasureText: http://stackoverflow.com/questions/1453327/relation-between-length-and-font-size-of-a-string-andwidth-of-a-textbox. Zastanawiam się, czy istnieje sposób, aby retro dopasować to do współczynnika rozmiaru czcionki? – Josh

+0

Jeśli otoczysz swoją blokadę TextBlock w programie ScrollViewer, a następnie obsłużysz zdarzenie, gdy pojawi się poziomy pasek przewijania. Następnie możesz zmienić rozmiar czcionki i anulować pojawianie się paska przewijania. Teoretycznie ... Nie sprawdziłem, czy jest to możliwe, ale zrobię to. –

Odpowiedz

0

Nie jestem pewien co do WPF, ale w WinForms można użyć metody MeasureString do pomiaru wymiarów łańcuchów w danej czcionce. Tak więc, gdy zmienia się zawartość bloku tekstu, wystarczy użyć tej metody i jeśli wymiary tekstu są większe niż wymiary bloku tekstowego - zmniejsz rozmiar czcionki i zmierz ponownie.

(obecnie, po Pisałem to, myślę, że nie powinno być prostsza metoda ta)

0

To zależy co czcionki użyć, na przykład, Courier New jest zaprojektowana tak, aby każdy znak taką samą szerokość, więc jeśli przeprowadzasz badania na temat szerokości znaków na znak, możesz użyć funkcji get get dla ciągu znaków (podając długość w znakach), a następnie obliczyć jej szerokość w pikselach. Jeśli jego szerokość przekracza 511px, dostosowujesz odpowiednio rozmiar.

Jeśli używasz innej czcionki, np. Arial, możesz zrobić to samo i jeśli naprawdę chcesz, aby była dokładna, możesz pogrupować alfabet w wąskie litery, takie jak "i", "l" itd., A także średnie litery, takie jak " t 'i grubych liter, takich jak' o 'i liter. Otrzymasz liczbę wąskich, średnich i grubych liter i obliczasz ich wielkość, ale osobiście to dla mnie za dużo.

Mam nadzieję, że to było pomocne.

Edytuj: Zignoruj ​​ten, właśnie przeczytałem o funkcji pomiaru, jest to znacznie mniejszy wysiłek niż moja sugestia.

0

Oto, co wymyśliłem. Upewnij się, że obsługujesz wielkość liter w rozmiarze -1.0.

 private static double GetFontSize(TextBox textBox) 
     { 
     double fontSize = textBox.FontSize; 
     FormattedText ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, 
              new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch), 
              fontSize, textBox.Foreground); 
     while (textBox.Width < ft.Width) 
     { 
      fontSize -= 1; 
      if (fontSize < 0) return -1.0; 
      ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, 
                 new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch), 
                 fontSize, textBox.Foreground); 
     } 

     return fontSize; 
     } 
0

Edytuj: Powinienem spojrzeć na tagi przed wysłaniem. Nie ma pojęcia, co WPF może zaoferować, aby rozwiązać ten problem.

nie mam żadnego dowodu na poparcie tego, ale wydaje się, że (również dla czcionek o zmiennej szerokości, co najmniej wszystkie te zainstalowane na moim komputerze):

  • rozmiar czcionki ma liniową związek z szerokości danego łańcucha
  • rozmiaru czcionki 0 wyniki w szerokości 0

oznacza to prawdopodobnie można użyć MeasureString raz na największy rozmiar czcionki dozwolone, a następnie interpolacji, aby znaleźć optymalny rozmiar czcionki .

Są pewne "pikselowe uderzenia" na tej "liniowej drodze", więc możesz być kilka pikseli wyłączonych - ale jest to dobra alternatywa dla pętli pomiarowych.

2

To rozwiązanie sugeruje użycie ViewBox, myślę, że dzięki funkcjom wtf Wpf nie ma potrzeby zmiany rozmiaru czcionki tekstu, Prawie ten sam wynik można archiwizować za pomocą transformacji (i ViewBox w tym przypadku) .

Zamiast umieszczać swoje TextBlock wewnątrz ViewBox, modyfikować to szablon i umieścić kontrolę gdzie pojawia się tekst wewnątrz ViewBox, coś jak:

<ControlTemplate TargetType="{x:Type TextBox}">      
    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true"> 
     <Viewbox HorizontalAlignment="Left"> 
      <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
     </Viewbox> 
    </Microsoft_Windows_Themes:ListBoxChrome> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Teraz masz kontrolę że rozmiary to tekst, aby zmieścić się dostępne miejsce, dzięki WPF.

Również tutaj jest kilka przykładów

text example

Powiązane problemy