在运行时加载XAML,但控制CLR类型解析?

时间:2017-03-17 12:05:57

标签: c# wpf xaml

假设我有一个描述窗口的XAML字符串,其中包含一个带有自定义附加行为的TextBox:

<Window x:Class="System.Windows.Window" >
  <Grid>
    <TextBox behaviors:TextBoxCursorPositionBehavior.TrackCaretIndex="True"/>
  </Grid>
</Window>

我想在运行时解析它,并实例化它描述的窗口。 目前,我正在做:

    System.Windows.Markup.ParserContext parserContext = new System.Windows.Markup.ParserContext();
    parserContext.XmlnsDictionary.Add( "", "http://schemas.microsoft.com/winfx/2006/xaml/presentation" );
    parserContext.XmlnsDictionary.Add( "x", "http://schemas.microsoft.com/winfx/2006/xaml" );
    parserContext.XmlnsDictionary.Add("behaviors", "clr-namespace:;assembly=" + typeof(TextBoxCursorPositionBehavior).Assembly.FullName);

    var window = (System.Windows.Window)XamlReader.Load(sr, parserContext);
    window.ShowDialog();

原则上有效。 但是,在我的环境中,我需要控制XAML在实例化窗口时如何尝试查找相应的CLR类型。

具体来说,我的程序集中的&#34; TextBoxCursorPositionBehavior&#34; -class实际命名为&#34;提交#0 + TextBoxCursorPositionBehavior&#34;在已编译的程序集中,因为它是作为Roslyn脚本的一部分创建的(请参阅WPF/XAML: How to reference class that is not defined within any namespace)。

现在&#34;提交#0 + TextBoxCursorPositionBehavior&#34;是XAML文件的格式无效,因此我无法在XAML中直接使用它。

我能想到如何潜在解决我的问题的唯一方法是,如果我可以控制自己的类型解决。即当XamlReader(或任何其他类,如果有替代方案?)试图找到对应于&#34; behavior:TextBoxCursorPositionBehavior&#34;的CLR类型时,我需要截取该步骤并返回正确的类型。

有没有办法做到这一点?

到目前为止,我只找到了XamlTypeMapper(通过ParserContext传递),但似乎只能用于控制解析命名空间。

0 个答案:

没有答案