Przy użyciu WPF, jaki jest najskuteczniejszy sposób pomiaru dużej liczby krótkich łańcuchów? W szczególności chciałbym określić wysokość wyświetlania każdego ciągu, biorąc pod uwagę jednolite formatowanie (tę samą czcionkę, rozmiar, wagę itp.) I maksymalną szerokość, jaką może zająć ciąg znaków?Pomiar tekstu w WPF
Odpowiedz
Najbardziej niskopoziomową techniką (a więc dającą najwięcej możliwości twórczej optymalizacji) jest użycie GlyphRuns.
To nie jest bardzo dobrze udokumentowane, ale napisałem do góry trochę przykład tutaj:
http://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/
Przykład odrabia długość napisu jako niezbędny krok przed czynią je.
Można użyć właściwości DesiredSize na wytopione TextBox, aby uzyskać wysokość i szerokość
using System.Windows.Threading;
...
Double TextWidth = 0;
Double TextHeight = 0;
...
MyTextBox.Text = "Words to measure size of";
this.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new DispatcherOperationCallback(delegate(Object state) {
var size = MyTextBox.DesiredSize;
this.TextWidth = size.Width;
this.TextHeight = size.Height;
return null;
}
) , null);
Jeśli masz dużą liczbę strun może być szybciej do pierwszego wstępnego calualte wysokość i szerokość każdego pojedyncza litera i symbol w danej czcionce, a następnie wykonaj obliczenia na podstawie znaków smyczkowych. To może nie być 100% acurate ze względu na kerning itp.
Jest to bardzo proste i wykonane przez klasę FormattedText! Wypróbuj.
FormattedText nie jest dostępny w UniversalWindows, pomóżcie mi! –
W WPF:
Pamiętaj, aby zadzwonić Measure() na TextBlock przed przeczytaniem właściwość DesiredSize.
Jeśli TextBlock powstał on-the-fly, i jeszcze nie widać, trzeba zadzwonić do środka() po pierwsze, tak jak poniżej:
MyTextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return new Size(MyTextBlock.DesiredSize.Width, MyTextBlock.DesiredSize.Height);
w Silverlight:
Nie trzeba mierzyć.
return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight);
Kompletny kod wygląda następująco:
public Size MeasureString(string s) {
if (string.IsNullOrEmpty(s)) {
return new Size(0, 0);
}
var TextBlock = new TextBlock() {
Text = s
};
#if SILVERLIGHT
return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight);
#else
TextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
return new Size(TextBlock.DesiredSize.Width, TextBlock.DesiredSize.Height);
#endif
}
- 1. Pomiar szerokości tekstu w Qt
- 2. pomiar tekstu na skalowanym płótnie
- 3. Zawijanie tekstu w WPF hiperłącze
- 4. Wiązanie tekstu wpf textbox
- 5. Wiązanie tekstu WPF TextBlock
- 6. Pomiar przełączania
- 7. Wyrównanie tekstu w pionie w WPF TextBlock
- 8. WPF: Ustawianie wyrównania tekstu GridViewColumn
- 9. C#/WPF: Wyłącz zawijanie tekstu w RichTextBox
- 10. Wyrównaj pionowo bloki bloków tekstu w WPF
- 11. Zapobieganie autouzupełnianiu tekstu w programie WPF ComboBox?
- 12. WPF ListView: Wyrównanie tekstu w wybranych kolumnach
- 13. Jak rozpocząć pomiar w połowie?
- 14. Pomiar wydajności PHP
- 15. dokładny pomiar czasu
- 16. Pomiar wydajności algorytmu klasyfikacji
- 17. Pomiar rozdzielczości `std :: clock()`
- 18. Dokładny pomiar wielkości obiektów
- 19. WPF TextBox spust do zwykłego tekstu
- 20. WPF Dodaj obramowanie do blokady tekstu
- 21. Pomiar zużycia pamięci strony internetowej
- 22. Pomiar poziomu za pomocą AVAudioEngine
- 23. Pomiar ruchu w sieci z Indy
- 24. Pomiar pamięci szczytowej długotrwałego procesu w Linuksie
- 25. Pomiar czasu wykonywania w języku D
- 26. Pomiar kosztu brakującej TLB w x86-64
- 27. Pomiar w usłudze Google App Engine
- 28. Pomiar kampanii Android nie działa
- 29. Jak uzyskać dokładny pomiar pingowania?
- 30. Pomiar czasu wykonywania zadania selera
samo pytanie na forum MSDN dostał jakieś lepsze rozwiązania: http://social.msdn.microsoft.com/Forums/en-US/wpf/ thread/a450b0aa-7086-4145-9eff-a779571b6187/ – srgstm