用于确定嵌入 XAML 的程序集的 WPF MarkupExtension

发布于 2024-11-05 21:52:02 字数 174 浏览 4 评论 0原文

我有一个 WPF 项目(在 .NET 4.0 中),其中 XAML 资源作为页面嵌入到程序集中。在 XAML 中,我需要在另一个程序集中声明 MarkupExtension,而该程序集对 XAML 的程序集没有特定的了解。

现在,我需要此 MarkupExtension 才能访问嵌入 XAML 的程序集。这怎么可能?

I have a WPF project (in .NET 4.0) with XAML resources embedded in as assembly as Pages. In the XAML, I need to have MarkupExtension that is declared in another assembly that has no specific knowledge of the assembly with the XAML.

Now, I need this MarkupExtension to be able to access the assembly in which the XAML is embedded. How is this possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美羊羊 2024-11-12 21:52:02

经过一番尝试后,我得出了结论:

public override object ProvideValue( IServiceProvider serviceProvider )
{
    var contextProvider = (IXamlSchemaContextProvider)serviceProvider.GetService( typeof( IXamlSchemaContextProvider ) );
    var type = contextProvider.SchemaContext.GetType().Assembly.GetType( "System.Windows.Baml2006.Baml2006SchemaContext" );
    var property = type.GetProperty( "LocalAssembly", BindingFlags.Instance | BindingFlags.NonPublic );
    var assembly = (Assembly)property.GetValue( contextProvider, null );
    ...
}

希望对其他人有帮助。

After a bit of playing around, I worked it out:

public override object ProvideValue( IServiceProvider serviceProvider )
{
    var contextProvider = (IXamlSchemaContextProvider)serviceProvider.GetService( typeof( IXamlSchemaContextProvider ) );
    var type = contextProvider.SchemaContext.GetType().Assembly.GetType( "System.Windows.Baml2006.Baml2006SchemaContext" );
    var property = type.GetProperty( "LocalAssembly", BindingFlags.Instance | BindingFlags.NonPublic );
    var assembly = (Assembly)property.GetValue( contextProvider, null );
    ...
}

Hope that helps someone else.

筱果果 2024-11-12 21:52:02

问题是:您需要程序集的名称/路径才能在 XAML 中使用它。 (示例)

您的方法是通过动态加载所需的程序集在代码隐藏中使用 MarkupExtension。

The problem is: You need the name/path of the assembly to use it in XAML. (example)

Your way is to use the MarkupExtension in the code-behind by dynamically loading your needed assembly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文