【问题标题】:WPF xaml objects from dynamic assembly来自动态程序集的 WPF xaml 对象
【发布时间】:2014-06-04 05:25:49
【问题描述】:

我正在开发某种互操作性库,但遇到了以下问题。

我的互操作性库使用 Emit 在动态程序集中反映来自其他语言的类。并且在构建时没有可用的类。当我尝试将动态程序集放入 XAML 中时:

xmlns:test="clr-namespace:ClassesReflected;assembly=ClassesReflected"

然后用这个从那里得到一个类

<test:TestDelegate x:Key="dyn" x:Name="dyn"/>

我在编译时出错。

是否有绕过编译时检查或在运行时加载 xaml 或其他任何方法来使此解决方案正常工作?

任何提示。高度赞赏。

【问题讨论】:

    标签: c# wpf xaml dynamic reflection.emit


    【解决方案1】:

    我不确定这是否适合你,但有一种方法。

    首先你需要定义一个命名空间并忽略它:

     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     xmlns:validation="http://schemas.microsoft.com/winfx/2006/ololo"
     mc:Ignorable="validation"
    

    然后在代码中:

     [assembly: XmlnsDefinition("http://schemas.microsoft.com/netfx/2007/xaml/  
     ololo", "SuperOlolo")]
    

    然后你可以随意使用这个命名空间:

     <validation:ValidationSummary Style="{StaticResource ValidationSummaryStyle}"
     Width="300" />
    

    这将提供一个清晰的构建。

    Designer 使用此方法来读取设计时人员。

    我不知道它是否可以提供您在运行时所需的一切,可能有些技巧会对您有所帮助。

    【讨论】:

    • 非常感谢!它真的尝试创建任何东西,还是忽略意味着在编译过程中完全忽略了所有这些东西?
    • 我不确定,但事实是设计器可以使用被忽略的命名空间中定义的属性。它甚至可以在设计时将 DataContext 分配给每个元素。设计师可能会以他自己的方式以某种方式加载 xaml。我们的想法是了解设计师是如何做到的,这可能会有所帮助。
    • 太好了,我会在接下来的几天里试一试,然后告诉你结果。
    • 但是“可忽略”不只是意味着 XAML 处理器将忽略该元素吗?此外,即使它没有,如果它没有命名空间/程序集引用,它怎么知道如何找到该类?
    • 一直在查看 WPF 扩展 API,但似乎没有任何可能。有什么想法吗?
    【解决方案2】:

    至少您可以使用包装器接口/类来使要在 XAML 中访问的成员可见。

    【讨论】:

    • 主要思想是避免所有这些“包装”的东西。所有类都是在运行时生成的,并且完全可以从 C# 代码中使用。不需要额外的包装器。现在的挑战是让它们在 WPF/XAML 中可见。
    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2015-12-23
    • 2021-09-10
    相关资源
    最近更新 更多