我需要顯示一個字符串,每個字符顯示每x個像素。 (x是貫穿整個字符串的)。WPF TextBlock:如何均勻分隔顯示的字符?
例如: 「你好」 - >在位置H(像素)0,E在位置50,升在100,升在150,鄰在200處
我當然可以使用一個TextBlock爲每個字符但似乎矯枉過正。
TranslateTransform似乎並沒有這樣做:它會將我的角色相對於前一個角色的END,這並不是我想要的。
TIA爲您提供幫助。
我需要顯示一個字符串,每個字符顯示每x個像素。 (x是貫穿整個字符串的)。WPF TextBlock:如何均勻分隔顯示的字符?
例如: 「你好」 - >在位置H(像素)0,E在位置50,升在100,升在150,鄰在200處
我當然可以使用一個TextBlock爲每個字符但似乎矯枉過正。
TranslateTransform似乎並沒有這樣做:它會將我的角色相對於前一個角色的END,這並不是我想要的。
TIA爲您提供幫助。
我不認爲在WPF中有這樣做的內置能力,但我可能是錯的。
下面的代碼演示瞭如何編寫自己的控件來爲您完成此操作。它是沒有效率的,它可以用做的調整,其中包括更多的屬性來控制字體諸如此類,但你的想法:
SpacedTextBlock.cs:
public class SpacedTextBlock : Control
{
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text",
typeof(string),
typeof(SpacedTextBlock));
public string Text
{
get { return GetValue(TextProperty) as string; }
set { SetValue(TextProperty, value); }
}
protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext);
if (Text != null)
{
var widthPerChar = ActualWidth/Text.Length;
var currentPosition = 0d;
foreach (var ch in Text)
{
drawingContext.DrawText(new FormattedText(ch.ToString(), CultureInfo.CurrentUICulture, FlowDirection.LeftToRight, new Typeface("Arial"), 12, Foreground), new Point(currentPosition, 0));
currentPosition += widthPerChar;
}
}
}
}
Window1.xaml:
<local:SpacedTextBlock Text="Hello"/>
結果:
alt text http://img199.imageshack.us/img199/8022/screenshotud.png
我想這取決於你的情況的細節,這是否會起作用。 但是,你可以在每個字母之間添加空格,並將文本對齊設置爲合理嗎?
不幸的是,如果這是你所需要的,你不會這樣設置像素數量......但是你甚至可以用這種方式進行間隔。如果這不僅僅是你的窗口上的一個位置,或者對於動態文本來說更復雜一點......那麼你可能希望看看更優雅的解決方案。
斯科特,您的解決方案具有最佳的快速和髒/有效率。自定義字體和al不需要額外的代碼。不幸的是,經過一些測試後,我們不得不放棄它,因爲副作用小。你有我的+1雖然 – 2009-09-29 16:58:23
謝謝,我希望你找到一個很好的解決方案! – Scott 2009-09-29 18:17:27
有趣。我不得不添加更多的代碼來支持自定義字體和顏色。謝謝。 – 2009-09-29 16:56:12