Je cherche un moyen de présenter des chaînes courtes FlowDocument
dans un contrôle de type étiquette.Comment afficher en lecture seule seulement FlowDocument dans une commande de type étiquette
Dans WPF, l'utilisateur peut entrer du texte dans un RichTextBox
. Le résultat est une chaîne FlowDocument
. Je cherche une façon de présenter ce texte dans un Label
, dans lequel:
- L'utilisateur ne doit pas être en mesure de modifier ou de sélectionner (avec la souris) le texte.
- Il ne devrait pas y avoir de barre de défilement - comme dans une étiquette normale, le contrôle devrait s'étendre pour accommoder tout le texte.
- Si l'utilisateur fait défiler pendant que la souris est sur l'étiquette, le contrôle à faire défiler est le parent du contrôle
- Le contrôle doit être aussi léger que possible.
J'ai la mise en œuvre suivante qui hérite FlowDocumentScrollViewer
mais je suis sûr qu'il doit y avoir une meilleure mise en œuvre (éventuellement héritant autre contrôle que 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);
}
}
}