FlowDocument and XamlReader x:Class

本文关键字:Class XamlReader and FlowDocument | 更新日期: 2023-09-27 18:08:21

在我的MainWindow中,我有一个FlowDocumentScrollViewer将其属性Document绑定到我的MainViewModel中的FlowDocument

该文档是从远程计算机上的外部xaml文件存储加载的。目前,我能够通过XamlReader.Load(xamlfile)正确加载此文档并在FlowDocumentScrollViewer中显示它。到目前为止一切顺利。

当我尝试在此文档中添加超链接时出现问题。因为要处理RequestNavigate事件,我需要x:Class。目前这个类需要是我的MainWindow,因为事件是在代码后面处理的。显然,当我在外部文档中添加x:Class="Ugrader.MainWindow"时,我在解析时得到了一个可爱的'System.Windows.Markup.XamlParseException'

有办法解决这个问题吗?

这是我的一段代码

<标题> MainWindow.xaml h1> MainViewModel.cs h1> 部FlowDocument
<FlowDocument x:Class="Ugrader.MainWindow" 
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              ColumnWidth="400" FontSize="12" FontFamily="Century Gothic" Foreground="LightGray">
  <Paragraph>
    <Italic>
      For additionnal information, please watch this
      <Hyperlink TextDecorations="{x:Null}" RequestNavigate="Hyperlink_Clicked" NavigateUri="path_to_the_file" >video</Hyperlink>
    </Italic>
  </Paragraph>
</FlowDocument>

顺便说一下,是否有一种方法来处理这个解析异常(在坏的外部文件的情况下),因为即使在这个try/catch块中,这也会停止我的程序。

提前谢谢你,

Bastien

.

FlowDocument and XamlReader x:Class

我找到了一个方法来处理我的问题,它不是很漂亮,不尊重mvvm的精神,但是,好吧,这是有效的。

所以,由于不可能在运行时添加x:Class(我猜),我想到了在运行时处理每个Hyperlink RequestNavigate事件的想法。所以解决方案非常简单(也很脏)。

在代码背后(是的,我知道,它是丑陋的),在MainWindow加载的事件,我在我的文档中找到所有超链接,并处理每个RequestNavigate事件。就像这样简单(和肮脏)。

下面是一些代码:
 private void Window_Loaded(object sender, RoutedEventArgs e)
 {
    var hyperlinks = GetVisuals(this).OfType<Hyperlink>();
    foreach (var link in hyperlinks)
    link.RequestNavigate += link_RequestNavigate;
 }
 public static IEnumerable<DependencyObject> GetVisuals(DependencyObject root)
 {
     foreach (var child in LogicalTreeHelper.GetChildren(root).OfType<DependencyObject>())
     {
         yield return child;
         foreach (var descendants in GetVisuals(child))
             yield return descendants;
     }
 }

如果有人有更好的解决办法,我就采纳。