2

我正在开发一个自定义标记扩展,其作用很简单:

在扩展构造函数参数(类型)上使用 System.Activator 并实例化它。

 public class MyExtension : MarkupExtension
 {
    private readonly Type _myType;

    public MyExtension (Type param)
    {
        _myType= param;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return Activator.CreateInstance(_myType);
    }
 }

在运行时,此扩展按预期运行。

但是在设计时,激活类型时会引发异常。

我已经深入寻找源头,并抓住了鲸鱼:

    try
    {
        return Activator.CreateInstance(_myType);
    }
    catch (TypeInitializationException ex)
    {

    }

所以我循环了这个:

 (ex.InnerException as ReflectionTypeLoadException).LoaderExceptions[i].Message);

并检索到以下消息

找不到 Windows 运行时类型“Windows.ApplicationModel.Core.IFrameworkView”。

找不到 Windows 运行时类型“Windows.ApplicationModel.Core.IFrameworkViewSource”。

由于我的代码在运行时运行良好,我唯一的猜测是 VS(.NET 4.5.1 上的 2013 更新 2)

或者 Xaml 设计器只是在寻找错误的程序集。

关于如何解决这个问题的任何想法,或者任何其他关于这个问题的想法,也许?

非常感谢您抽出宝贵时间。

4

1 回答 1

0

我进一步研究了这个问题,得出了以下结论:

这个问题的唯一解决方案是区分设计时的返回值和运行时的返回值。

这很容易完成,并且在我正在开发的 WPF 框架中实现。

请参阅外围框架

相关程序集为 PerrypheralFramework.WPF,相关类为:PerrypheralFramework.WPF.MarkupExtensions.Base.DependencyObjectDependantExtensionBase

于 2014-12-09T09:35:54.403 回答