一个TabItem的内容是创建的昂贵的CPU。想要仅在IsSelected = True时通过TabItem的绑定获取内容。或者根据IsSelected True或False获取备用内容。在这种情况下放弃IsAsync = True不是一种选择。
下面的XAML可以工作,但无论IsSeleted = False还是IsSelected = True,它都会检索内容。
<TabItem IsSelected="False" Header="Expensive Content">
<FlowDocumentReader Name="FlowDocumentPageViewer1" HorizontalAlignment="Stretch" DataContext="{Binding Source={x:Static Application.Current}}">
<FlowDocumentReader.Document>
<Binding Path="MyGabeLib.Search.SelectedDoc.XAMLdocFlowDocument" IsAsync="True" Converter="{StaticResource flowDocumentToXamlConverter}"
FallbackValue="{StaticResource DefaultFlowDoc}" Mode="OneWay"/>
</FlowDocumentReader.Document>
</FlowDocumentReader>
</TabItem>
转换器将字符串(使用XamlWriter.Save(DocFlowDocument)序列化)转换回FlowDocument,因为不能将IsAsync = True(直接)与FlowDocument一起使用。
绑定到后面的代码中的属性以重定向不起作用,因为具有IsAcync = True的UI在另一个线程上并且无法访问IsSelected。
希望使用带触发器的模板,但这是我得到的。不是很远,但它不会引发语法错误。
<TabItem IsSelected="False" Name="TabItemFlowDoc">
<FlowDocumentReader ...>
<FlowDocumentReader.Template>
<ControlTemplate>
</ControlTemplate>
</FlowDocumentReader.Template>
</FlowDocumentReader>
直接在TabControl上尝试触发,甚至无法解决语法错误
<TabControl Grid.Row="0" Grid.Column="0" Name="TabControlView">
<TabControl.Resources>
<DataTemplate>
<FlowDocumentReader.Template>
</FlowDocumentReader.Template>
</DataTemplate>
</TabControl.Resources>
提前致谢。
答案 0 :(得分:0)
所以我最终做的是获取文档文本和其他参数以在后台线程上标记它。然后在UI线程上,如果选中该选项卡,则检查TabIndex,如果选中该选项卡,则仅生成FlowDocument。另一个选项卡显示文本的前4000个字符,以便用户可以快速决定是否要呈现完整突出显示的文档。