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="" /> = 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=""
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.
(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.
Bitte sehen Sie [diese Antwort] (https://stackoverflow.com/a/47803012/4184842), um zu sehen, ob es hilft ... 'HasOverflowContent' ist ein wenig schwierig. –
@ 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? –
@ 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. –