Question

J'ai un document de flux dans WPF qui ressemble à ceci:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Paragraph FontFamily="Georgia">
        <StackPanel>
            <TextBlock Text="{Binding Path=Title}"/>
            <TextBlock Text="{Binding Path=AssignedTo}"/>
        </StackPanel>
    </Paragraph>
</FlowDocument>

Au lieu de donner au DataContext une classe avec la propriété Title et AssignedTo, j'aimerais lui donner une liste de cette classe et laisser le document flowdocument afficher chacun des objets. Quelqu'un peut-il me dire comment former le code XAML dans le document flow pour le faire?

Était-ce utile?

La solution

Qui sait, aussi simple que l’exemple de code suivant fonctionnera pour vous, 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>

Si ce n'est pas le cas, vous pouvez toujours créer votre propre propriété attachée et faire tout ce que vous pouvez imaginer dans la notification de propriété modifiée. Voici un petit échantillon avec le contrôle Span:

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>

J'espère que cela vous aidera:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top