Robery Levyの回答によると、Viewbox
を使用してこれを達成できます。テキスト自体は伸びませんので、テキストに応じて0以上の余白にも余裕があります(気づいたとおり)。この問題を回避するには、FormattedText
からGeometry
を作成し、これをOnRenderにDrawGeometry
で描画するカスタムコントロールを作成します。テキストの品質がどのように向上するのかがわかりますFontSize
。あなたは少し
いくつかのサンプルのXAML
<Canvas Background="Black">
<Viewbox Canvas.Left="10" Canvas.Top="10"
Stretch="Fill" Width="200" Height="50">
<Border Background="Red">
<local:StretchText Text="Text" Foreground="Green" FontSize="100"/>
</Border>
</Viewbox>
<Viewbox Canvas.Left="230" Canvas.Top="10"
Stretch="Fill" Width="200" Height="50">
<Border Background="Red">
<local:StretchText Text="B" Foreground="Green" FontSize="500"/>
</Border>
</Viewbox>
</Canvas>
StretchTextに実験する必要がありますので、非常に小さなテキスト(例えばFontSize="10"
は)大きなViewbox
に非常に鋭い見ていないだろう.cs
public class StretchText : Control
{
protected override void OnRender(DrawingContext drawingContext)
{
FormattedText formattedText = new FormattedText(
Text,
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface(FontFamily, FontStyle, FontWeight, FontStretches.Normal),
FontSize,
Foreground);
Geometry textGeometry = formattedText.BuildGeometry(new Point(0, 0));
this.MinWidth = textGeometry.Bounds.Width;
this.MinHeight = textGeometry.Bounds.Height;
TranslateTransform translateTransform = new TranslateTransform();
translateTransform.X = -textGeometry.Bounds.Left;
translateTransform.Y = -textGeometry.Bounds.Top;
drawingContext.PushTransform(translateTransform);
drawingContext.DrawGeometry(Foreground, new Pen(Foreground, 1.0), textGeometry);
}
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text",
typeof(string),
typeof(StretchText),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.AffectsRender));
}
ありがとう!私はそれをテストし、それはかなりうまくいく。その間、私は一時的なFormattedTextオブジェクト(プロパティ "Width"、 "Extent"、 "OverhangAfter"のおかげで)を使ってテキスト要素を測定し、それに応じてScale + TranslateTransformをそれに応じて適用しました。しかし、それには2つの欠点があります。実際のテキストブロックのオブジェクトが大きすぎる(ツールチップが邪魔になる)、レンダリングが私の望むほど高速ではありません。 – Jem
@ Jem:問題ありません:)ソリューション間のレンダリング時間はどうでしたか?どちらの場合でも「遅くなる」のですか?私は 'StretchText'を' Grid'で同時に10個試してから、 'Window'をすばやくサイズ変更しました。私はかなりうまく動作していたようですが、 'DrawGeometry'はかなり遅いと知られています –
表示する単語の数は約1〜2千ですが、ページのサイズを変更することはあなたの解決策では十分です。私はそれが鉱山より約3倍速く、安定していると言いたいと思います(「遅延」はありません)。しかし、テキストの品質は、小さなテキストではそれほど急ではありません(これはおそらく「テキスト」ではなく「ジオメトリ」なので)、十分です。理想的には、より良いパフォーマンスと最高のテキスト品質をお望みですが、あなたのソリューションは今のところ最高の妥協点です。 – Jem