Repeating databound item in WPF FlowDocument

前端 未结 1 577
我寻月下人不归
我寻月下人不归 2021-01-05 22:34

I have a flowdocument in WPF that looks like this:



        
相关标签:
1条回答
  • 2021-01-05 23:17

    Who knows, maybe as simple as the following code sample will work for you, Ajma:

    <Window x:Class="WpfTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:WpfTest="clr-namespace:WpfTest"
        xmlns:System="clr-namespace:System;assembly=mscorlib"
        xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
        Title="Bound Inlines Sample" Height="300" Width="300">
      <Window.Resources>
        <Collections:ArrayList x:Key="array">
          <System:String>Hello</System:String>
          <System:String>World</System:String>
          <System:String>!</System:String>
        </Collections:ArrayList>
      </Window.Resources>
      <Grid>
        <FlowDocumentReader>
          <FlowDocument>
            <Paragraph FontFamily="Georgia">
                <ItemsControl ItemsSource="{StaticResource array}"/>            
            </Paragraph>
          </FlowDocument>
        </FlowDocumentReader>
      </Grid>
    </Window>
    

    If it's not, you can always create your own attached property and do whatever you can imagine inside property changed notification. Here is a small sample with Span control:

    CS:

    public class SpanOperations : DependencyObject
    {
      public static IEnumerable GetInlineSource(DependencyObject obj)
      {
        return (IEnumerable)obj.GetValue(InlineSourceProperty);
      }
    
      public static void SetInlineSource(DependencyObject obj, IEnumerable value)
      {
        obj.SetValue(InlineSourceProperty, value);
      }
    
      public static readonly DependencyProperty InlineSourceProperty =
          DependencyProperty.RegisterAttached("InlineSource", typeof(IEnumerable), typeof(SpanOperations), new UIPropertyMetadata(null, OnInlineSourceChanged));
    
      private static void OnInlineSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
      {
        var span  = d as Span;
        if (span == null)
        {
          // It's a demo only. Can work with only spans... 
          return;
        }
        span.Inlines.Clear();
    
        var inlines = e.NewValue as IEnumerable;
        if (inlines != null)
        {
          foreach (var inline in inlines)
          {
            // We assume only inlines will come in collection:
            span.Inlines.Add(inline as Inline);
          }
    
        }
      }
    }
    

    XAML

    <Window x:Class="WpfTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:WpfTest="clr-namespace:WpfTest"
        xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib"
        Title="Bound Inlines Sample" Height="300" Width="300">
      <Window.Resources>
        <Collections:ArrayList x:Key="array">
          <Run>Hello</Run>
          <LineBreak/>
          <Run>Hello</Run>
          <LineBreak/>
          <Bold>
            <Run>Hello</Run>
          </Bold>
        </Collections:ArrayList>
      </Window.Resources>
      <Grid>
        <FlowDocumentReader>
          <FlowDocument>
            <Paragraph FontFamily="Georgia">
              <Span WpfTest:SpanOperations.InlineSource="{Binding Source={StaticResource array}}"/>
            </Paragraph>
          </FlowDocument>
        </FlowDocumentReader>
      </Grid>
    </Window>
    

    Hope this helps :)

    0 讨论(0)
提交回复
热议问题