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