2017-12-21 10 views
1

Ich richte Druckfunktionalität in meiner App ein. Um dies zu tun, habe ich zwei Seiten: PrintPage und OverflowPage. Beide erben von meiner benutzerdefinierten Zusammenfassung Page, PrintablePage. Hier sind die XAML-Layouts für sie:RichTextBlock HasOverflow ist falsch

PrintPage.xaml

<RelativePanel> 

    <RelativePanel x:Name="Header" 
        BorderBrush="Gray" 
        BorderThickness="0 0 0 1" 
        Margin="48 48 48 12" 
        Padding="0 0 0 6" 
        RelativePanel.AlignLeftWithPanel="True" 
        RelativePanel.AlignRightWithPanel="True" 
        RelativePanel.AlignTopWithPanel="True"> 

     <TextBlock x:Name="RouteTextBlock" 
        Style="{ThemeResource TitleTextBlockStyle}" 
        Text="{x:Bind Route, Mode=OneWay}" /> 
     <TextBlock x:Name="StaffTextBlock" 
        Foreground="{ThemeResource ApplicationSecondaryForegroundThemeBrush}" 
        Margin="0 6 0 0" 
        RelativePanel.Below="RouteTextBlock" 
        Text="{x:Bind Staff, Mode=OneWay}" 
        TextWrapping="Wrap" /> 

     <TextBlock x:Name="Legend" 
        FontSize="14" 
        Foreground="{ThemeResource ApplicationSecondaryForegroundThemeBrush}" 
        Margin="0 12 0 24" 
        RelativePanel.Below="StaffTextBlock"> 

      <Run FontFamily="/Assets/Fonts/Kimble.ttf#Kimble-UWP" 
       FontSize="16" 
       Text="&#xf106;" /> = Parent must be present for pickup 

     </TextBlock> 

     <Grid x:Name="DataHeader" 
       RelativePanel.AlignLeftWithPanel="True" 
       RelativePanel.AlignRightWithPanel="True" 
       RelativePanel.Below="Legend"> 

      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="24" /> 
       <ColumnDefinition Width="48" /> 
       <ColumnDefinition /> 
       <ColumnDefinition /> 
       <ColumnDefinition Width="60" /> 
      </Grid.ColumnDefinitions> 

      <TextBlock x:Name="NameHeader" 
         FontWeight="SemiBold" 
         Grid.Column="2" 
         Grid.Row="2" 
         Text="Name" /> 
      <TextBlock x:Name="AddressHeader" 
         FontWeight="SemiBold" 
         Grid.Column="3" 
         Grid.Row="2" 
         Text="Address" /> 
      <TextBlock x:Name="AgeHeader" 
         FontWeight="SemiBold" 
         Grid.Column="4" 
         Grid.Row="2" 
         HorizontalTextAlignment="Right" 
         Text="Age" /> 
     </Grid> 

    </RelativePanel> 

    <RichTextBlock x:Name="MainContentTextBlock" 
        HorizontalAlignment="Stretch" 
        RelativePanel.Above="InstructionsTextBlock" 
        RelativePanel.AlignLeftWithPanel="True" 
        RelativePanel.AlignRightWithPanel="True" 
        RelativePanel.Below="Header" /> 

    <TextBlock x:Name="InstructionsTextBlock" 
       Foreground="{ThemeResource ApplicationSecondaryForegroundThemeBrush}" 
       Margin="0 0 0 24" 
       RelativePanel.AlignHorizontalCenterWithPanel="True" 
       RelativePanel.AlignBottomWithPanel="True" 
       Text="Please fill out this form and return it at the end of the night" /> 

</RelativePanel> 

OverflowPage.xaml

<RelativePanel Margin="0 0 0 12"> 

    <Grid x:Name="Header" 
      BorderBrush="Gray" 
      BorderThickness="0 0 0 1" 
      Margin="48 48 48 12" 
      Padding="0 0 0 6" 
      RelativePanel.AlignLeftWithPanel="True" 
      RelativePanel.AlignRightWithPanel="True" 
      RelativePanel.AlignTopWithPanel="True"> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="24" /> 
      <ColumnDefinition Width="48" /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition Width="60" /> 
     </Grid.ColumnDefinitions> 

     <TextBlock x:Name="NameHeader" 
        FontWeight="SemiBold" 
        Grid.Column="2" 
        Grid.Row="2" 
        Text="Name" /> 
     <TextBlock x:Name="AddressHeader" 
        FontWeight="SemiBold" 
        Grid.Column="3" 
        Grid.Row="2" 
        Text="Address" /> 
     <TextBlock x:Name="AgeHeader" 
        FontWeight="SemiBold" 
        Grid.Column="4" 
        Grid.Row="2" 
        HorizontalTextAlignment="Right" 
        Text="Age" /> 
    </Grid> 

    <RichTextBlockOverflow x:Name="OverflowBlock" 
          RelativePanel.AlignLeftWithPanel="True" 
          RelativePanel.AlignRightWithPanel="True" 
          RelativePanel.Below="Header" /> 

</RelativePanel> 

im Konstruktor für PrintPage ich eine Liste von Elementen machen:

var pageWidthBinding = new Binding 
{ 
    FallbackValue = 0, 
    TargetNullValue = 0, 
    Source = this, 
    Path = new PropertyPath("PageWidth"), 
    Mode = BindingMode.OneWay 
}; 

foreach (var child in Children) 
{ 
    var uiContainer = new InlineUIContainer(); 
    var contentPresenter = new ContentPresenter 
    { 
     Content = child, 
     ContentTemplate = ChildItemTemplate 
    }; 
    contentPresenter.SetBinding(WidthProperty, pageWidthBinding); 
    uiContainer.Child = contentPresenter; 
    var paragraph = new Paragraph { LineHeight = 18, Margin = new Thickness(0) }; 
    paragraph.Inlines.Add(uiContainer); 
    MainContentTextBlock.Blocks.Add(paragraph); 
} 

PageWidth ist ein DependencyProperty whi ch ich in der Seite SizeChanged Event-Handler gesetzt.

Die ChildItemTemplate:

<DataTemplate x:Name="ChildItemTemplate" 
       x:DataType="models:Child"> 
    <Grid Height="18" 
      Margin="48 12"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="24" /> 
      <ColumnDefinition Width="48" /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition Width="60" /> 
     </Grid.ColumnDefinitions> 

     <FontIcon x:Name="ParentPresentIcon" 
        x:Load="{x:Bind ParentMustBePresent}" 
        FontFamily="/Assets/Fonts/Kimble.ttf#Kimble-UWP" 
        FontSize="16" 
        Foreground="{ThemeResource ApplicationSecondaryForegroundThemeBrush}" 
        Glyph="&#xf106;" 
        Grid.Column="0" 
        HorizontalAlignment="Center" /> 
     <Border x:Name="HereCheckBox" 
       BorderBrush="{ThemeResource ApplicationSecondaryForegroundThemeBrush}" 
       BorderThickness="1" 
       CornerRadius="2" 
       Grid.Column="1" 
       Height="18" 
       HorizontalAlignment="Center" 
       Width="18" /> 
     <TextBlock Grid.Column="2" 
        Text="{x:Bind FullName}" /> 
     <TextBlock Grid.Column="3" 
        Text="{x:Bind Address}" /> 
     <TextBlock Grid.Column="4" 
        HorizontalTextAlignment="Right" 
        Text="{x:Bind Age}" /> 
    </Grid> 
</DataTemplate> 

Ich habe zwei Hilfsmethoden auf PrintPage und OverflowPage, die der Druckdienst ruft:

public override PrintablePage GetOverflowContent() => 
    new OverflowPage(MainContentTextBlock); 

und

public override bool HasOverflow() => 
    MainContentTextBlock.HasOverflowContent; 

Der Konstruktor für OverflowPage dann Sätze th e Parameter (eine RichTextBlock) OverflowContentTarget Eigenschaft zu OverflowPage .

Das alles funktioniert gut. Es gibt jedoch einen Fehler, den ich getroffen zu haben scheint. Das System scheint die -Eigenschaft nicht ordnungsgemäß zu berechnen. Wie Sie in diesem Bild sehen können, gibt es eindeutig einen Überlauf-Inhalt (es wird abgeschnitten), aber HasOverflowContent ist immer falsch.

Paper (Beachten Sie, dass Inhalt Wesen korrekt auf den Rest der Seite gerendert ist, aber ich habe aus Datenschutzgründen gelöscht es.)

Dies geschieht auf OverflowPage, aber ich denke, es ist sicher anzunehmen, das gleiche Problem wäre auch bei PrintPage vorhanden.

Fehle ich etwas, das mein Layout beeinflusst, oder ist das ein Fehler im System?

Entschuldigung für die Wand des Textes, aber mit dem, was scheint, ein Layout-Problem zu sein Ich denke, dass ich besser jeden Code veröffentlichen würde, der es möglicherweise beeinflussen könnte.

+0

Bitte sehen Sie [diese Antwort] (https://stackoverflow.com/a/47803012/4184842), um zu sehen, ob es hilft ... 'HasOverflowContent' ist ein wenig schwierig. –

+0

@ PeterTorr-MSFT Ok, lass mich einfach sicherstellen, dass ich verstehe, was du dort richtig gemacht hast. Schlagen Sie vor, dass (in meinem Fall) mein 'HasOverflow' async sein sollte und führen Sie Ihre' erwarten .FinishLayoutAsync() 'bevor ein Wert zurückgegeben wird? –

+0

@ PeterTorr-MSFT In Ordnung, also habe ich meine 'HasOverflow' asynchrone, führte die' FinishLayoutAsync' Methode und, mit ein paar zusätzlichen Änderungen an meinem Druckdienst, damit es asynchron arbeiten, bekomme ich jetzt meinen Überlauf Inhalt richtig. Vielen Dank! Wenn Sie Ihren Vorschlag als Antwort hinzufügen, werde ich ihn als akzeptiert markieren. –

Antwort

1

HasOverflowContent ist nicht unbedingt synchron verfügbar; Sie müssen warten, bis es verfügbar ist. Aber hören Sie einfach auf das LayoutUpdated Ereignis oder awaiting für das nächste UI Tick sind nicht genug - Sie müssen beides tun. This answer von einer verwandten Frage hat Code, um es zu tun.