2009-11-05 8 views
2

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:

  1. L'utilisateur ne doit pas être en mesure de modifier ou de sélectionner (avec la souris) le texte.
  2. 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.
  3. 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
  4. 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); 
     } 
    } 
} 

Répondre

0

Avez-vous essayé de définir IsReadOnly?

<RichTextBox IsReadOnly="True"/> 
0

Je pense que ce XAML répond à toutes vos exigences; il devrait être trivial d'en faire un contrôle utilisateur. Implémentez simplement une propriété de dépendance FlowDocument qui définit la propriété Document de RichTextBox.

La plupart de ce que vous voyez ci-dessous est juste un texte crypté afin que vous puissiez voir comment il fonctionne lorsque vous le collez dans Kaxaml ou quoi que ce soit; le noyau de celui-ci est un Grid contenant un RichTextBox avec un Border transparent dessus afin qu'il ne capture pas les événements de la souris ou les frappes au clavier.

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <DockPanel Margin="100"> 
    <ScrollViewer> 
     <StackPanel> 
     <Grid> 
      <RichTextBox Background="Coral"> 
      <FlowDocument> 
       <Paragraph> 
       Gluten-free pariatur exercitation laboris, salvia nisi excepteur. Elit quis PBR, jean shorts DIY excepteur tofu retro. Nulla art party farm-to-table, banh mi labore wes anderson marfa Austin portland carles tattooed 8-bit. Skateboard farm-to-table sed, lomo proident iphone mustache. Keffiyeh magna freegan mollit. Seitan viral consequat elit deserunt, occaecat vero tempor. Terry richardson esse mollit, anim chambray DIY squid.   </Paragraph> 
      </FlowDocument> 
      </RichTextBox> 
      <Border Background="Transparent"/> 
     </Grid> 
     <Grid> 
      <RichTextBox Background="AliceBlue"> 
      <FlowDocument> 
       <Paragraph> 
       Marfa locavore duis, chambray homo irure culpa et high life skateboard. Readymade sartorial odio deserunt. Dolore placeat scenester reprehenderit tattooed nisi. DIY fugiat tempor raw denim. Incididunt sapiente echo park ut yr, deserunt non williamsburg quis. Pitchfork nihil nisi etsy next level elit minim eu, id twee vero exercitation wes anderson. Ullamco beard delectus, before they sold out homo aliquip craft beer esse cillum mlkshk.   </Paragraph> 
      </FlowDocument> 
      </RichTextBox> 
      <Border Background="Transparent"/> 
     </Grid> 
     <Grid> 
      <RichTextBox Background="Goldenrod"> 
      <FlowDocument> 
       <Paragraph> 
       Laborum cliche quinoa odio nostrud Austin, dolor 3 wolf moon craft beer brunch ex vice. Excepteur ullamco fugiat, shoreditch assumenda squid sapiente craft beer viral vice non incididunt tempor. Ullamco gluten-free veniam, elit fugiat sustainable thundercats wolf fap Austin id nihil viral. Sartorial photo booth Austin, pitchfork labore PBR nisi cardigan dolore. Seitan dolor letterpress, banksy organic biodiesel tattooed aliqua. Letterpress ea 3 wolf moon, cosby sweater williamsburg ethical portland reprehenderit wayfarers nostrud beard laboris. Blog ethical trust fund, quinoa vegan skateboard sed art party messenger bag biodiesel do.   
       </Paragraph> 
      </FlowDocument> 
      </RichTextBox> 
      <Border Background="Transparent"/> 
     </Grid> 
     <Grid> 
      <RichTextBox Background="AntiqueWhite"> 
      <FlowDocument> 
       <Paragraph> 
       Assumenda ad aute cred est. Beard elit fugiat brunch, proident nulla 8-bit. Cardigan sapiente 8-bit tempor put a bird on it duis lo-fi. VHS before they sold out commodo, occaecat raw denim artisan dolor photo booth ex gentrify proident readymade ad. Artisan duis thundercats ex, 8-bit ut williamsburg portland seitan cred vinyl brooklyn. Aute deserunt beard cliche, you probably haven't heard of them commodo artisan tumblr irony put a bird on it VHS excepteur american apparel. Voluptate PBR artisan ut banksy, nostrud organic vero fap anim american apparel trust fund do exercitation.   </Paragraph> 
      </FlowDocument> 
      </RichTextBox> 
      <Border Background="Transparent"/> 
     </Grid> 
     </StackPanel> 
    </ScrollViewer> 
    <TextBlock/> 
    </DockPanel> 
</Page>