C# MarkupExtension.ProviderValue(IServiceProviderServiceProvider)在设计期间

C# MarkupExtension.ProviderValue(IServiceProviderServiceProvider)在设计期间,c#,wpf,xaml,C#,Wpf,Xaml,如果您编写自己的MarkupExtension,您可能会发现IServiceProvider serviceProvider-参数在设计时与运行时不同。例如,您无法获取IRootObjectProvider。那么,是否有任何关于参数对象实现的接口的文档,以及是否有任何解决方法来获取根对象?请查看以下链接将对您有所帮助 编写了一个小助手,用于查看哪些服务可用: public class ServiceExtension : MarkupExtension { public Service

如果您编写自己的
MarkupExtension
,您可能会发现
IServiceProvider serviceProvider
-参数在设计时与运行时不同。例如,您无法获取
IRootObjectProvider
。那么,是否有任何关于参数对象实现的接口的文档,以及是否有任何解决方法来获取根对象?

请查看以下链接将对您有所帮助


编写了一个小助手,用于查看哪些服务可用:

public class ServiceExtension : MarkupExtension
{
    public ServiceExtension()
    {
    }

    public ServiceExtension(Type serviceType)
    {
        ServiceType = serviceType;
    }

    [ConstructorArgument("serviceType")]
    public Type ServiceType { get; set; }

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public object Service { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (ServiceType == null)
        {
            Service= "ServiceType == null";
            return this;
        }
        var service = serviceProvider.GetService(ServiceType);
        Service= service ?? "null";
        return this;
    }
}



<Style TargetType="{x:Type HeaderedContentControl}">
    <Setter Property="Header" Value="{Binding ServiceType}" />
    <Setter Property="Content" Value="{Binding Service}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="Col1" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter Grid.Column="0"
                                      Margin="0,0,5,0"
                                      ContentSource="Header" />
                    <ContentPresenter Grid.Column="1" ContentSource="Content" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<ItemsControl Grid.IsSharedSizeScope="True">
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IXamlNameProvider}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IXamlNameResolver}}" />

    <HeaderedContentControl DataContext="{local:Service {x:Type x:IProvideValueTarget}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type x:IXamlTypeResolver}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type x:IValueSerializerContext}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type componentModel:ITypeDescriptorContext}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IDestinationTypeProvider}}" />

    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IXamlNamespaceResolver}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IXamlSchemaContextProvider}}" />

    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IRootObjectProvider}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type x:IUriContext}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IAmbientProvider}}" />
</ItemsControl>