IRootObjectProvider在Designer中不可用

本文关键字:Designer IRootObjectProvider | 更新日期: 2023-09-27 18:00:09

我有点像WPF新手,所以请大家对我宽容一点!

我正在尝试实现一个MarkupExtension,在其中我想引用正在调用扩展的XAML的根元素(我需要它的Name元素来进行查找)。

以下代码在运行时运行良好,但在设计时,我在设计器窗口中遇到错误。

[MarkupExtensionReturnTypeAttribute(typeof(string))]
public class TranslateExtension : MarkupExtension
{
    public TranslateExtension(string key)
    {
    }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var root = ((System.Xaml.IRootObjectProvider)serviceProvider).RootObject as FrameworkElement;
        return root.Name;
    }
}

在的设计器中给我一个错误

无法强制转换类型为的对象"InstanceBuilderServiceProvider"到类型"System.Xaml.IRootObjectProvider".

这有点不言自明——显然ProvideValue是用一个无法转换为RootObjectProvider的服务提供程序调用的。

周围有工作吗?还是我在做一些非常愚蠢的事情?

IRootObjectProvider在Designer中不可用

难道你不应该做类似的事情吗

var service = (IRootObjectProvider)serviceProvider.GetService(typeof(IRootObjectProvider));

然而,它仍然对设计者没有帮助。。。

试试这个:

var rootObjectProvider = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;

IRootObjectProvider目前在WPF 4中不可用,它将在将来包含。您可以通过编程方式使用支持IRootObjectProvider的Xaml服务,但WPF还不支持它。