2

独自に記述した場合、 -parameter が desingtime と実行時で異なるMarkupExtensionという事実に出くわす可能性があります。IServiceProvider serviceProviderたとえば、取得できませんIRootObjectProviderInterfacesそのパラメータ オブジェクトが実装するドキュメントはありますか?また、ルート オブジェクトを取得するための回避策はありますか?

4

2 に答える 2

2

利用可能なサービスを確認するための小さなヘルパーを作成しました。

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>
于 2015-10-03T00:57:18.387 に答える
1

以下のリンクをチェックしてください。

http://msdn.microsoft.com/en-us/library/system.windows.markup.markupextension.providevalue.aspx

http://vimalck.wordpress.com/2013/06/22/markup-extensions-for-events-in-net-4-5-2/

于 2013-08-25T11:37:59.343 に答える