FlowDocument
ラベルのようなコントロールに短い文字列を表示する方法を探しています。
WPF では、ユーザーはテキストを に入力できますRichTextBox
。結果はFlowDocument
文字列です。そのテキストを で表示する方法を探していますLabel
。
- ユーザーは、テキストを (マウスで) 編集または選択できないようにする必要があります。
- スクロール バーはありません。通常のラベルと同様に、コントロールはすべてのテキストに対応するように拡張する必要があります。
- マウスがラベル上にあるときにユーザーがスクロールする場合、スクロールする必要があるコントロールはコントロールの親です
- コントロールはできるだけ軽量にする必要があります。
継承する次の実装FlowDocumentScrollViewer
がありますが、より良い実装が必要であると確信しています (おそらく 以外のコントロールを継承していますFlowDocumentScrollViewer
)。
public class FlowDocumentViewer : FlowDocumentScrollViewer
{
public FlowDocumentViewer()
{
this.SetValue(ScrollViewer.CanContentScrollProperty, false);
this.SetValue(ScrollViewer.VerticalScrollBarVisibilityProperty, ScrollBarVisibility.Hidden);
this.Padding = new Thickness(-17);
this.Document = new FlowDocument();
}
protected override void OnMouseWheel(MouseWheelEventArgs e)
{
e.Handled = false;
}
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(FlowDocumentViewer), new UIPropertyMetadata(string.Empty, TextChangedHandler));
private static void TextChangedHandler(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.NewValue.Equals(string.Empty))
return;
FlowDocumentViewer fdv = (FlowDocumentViewer)d;
fdv.Document.Blocks.Clear();
using (MemoryStream stream = new MemoryStream(UTF8Encoding.UTF8.GetBytes(e.NewValue.ToString())))
{
Section content = XamlReader.Load(stream) as Section;
fdv.Document.Blocks.Add(content);
}
}
}