问题标签 [markup-extensions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4877 浏览

c# - 可以在 WPF 中使用与 XAML 2009 相关的标记扩展吗?

我说的是 和 之类的扩展名x:Reference,在这里x:FactoryMethod集体出现。我在网上阅读了很多相互矛盾的信息,包括 MSDN、Stackoverflow 和其他来源。

我将x:Reference作为示例进行讨论,但实际上我也指的是其他标记扩展。造成混淆的主要原因是 MSDN 的以下摘录:

WPF 中的 XAML 2009 语言支持

在 WPF 中,您可以使用 XAML 2009 功能,但仅适用于不是 WPF 标记编译的 XAML。标记编译的 XAML 和 XAML 的 BAML 形式目前不支持 XAML 2009 语言关键字和功能。请注意,在 WPF 中加载松散 XAML 的现有技术也可能对 CLR 类型和类型系统具有比标记编译的 XAML 更具限制性的安全性和访问限制。有关详细信息,请参阅安全 (WPF) 或 WPF 安全策略 - 平台安全。XAML 2009 还引入了修改以前的 XAML 2006 构造或修改基本标记形式的附加功能。

x:参考标记扩展

x:Reference 是在 XAML 2009 中定义的构造。在 WPF 中,您可以使用 XAML 2009 功能,但仅适用于非 WPF 标记编译的 XAML。标记编译的 XAML 和 XAML 的 BAML 形式目前不支持 XAML 2009 语言关键字和功能。

但是,下一段出现在上一段之前(即 about x:Reference)。

在 WPF 和 XAML 2006 中,元素引用由 ElementName 绑定的框架级功能处理。对于大多数 WPF 应用程序和方案,仍应使用 ElementName 绑定。此一般指南的例外情况可能包括存在数据上下文或其他范围考虑因素导致数据绑定不切实际以及不涉及标记编译的情况。

这里并没有直接的矛盾,但是这一段似乎是说可以x:Reference在应用程序中使用。此外,关于似乎是自动生成的那段x:Reference,并且可能已过时。

然后,我们从“WPF 4 Unleashed”一书中摘录了以下内容:

x:Reference 标记扩展经常被错误地与 XAML2009 功能相关联,这些功能在撰写本文时只能从松散的 XAML 中使用。尽管 x:Reference 是 WPF 4 中的一项新功能,但只要您的项目面向 .NET Framework 4 或更高版本,就可以从 XAML2006 使用它。

我们还有以下 Stackoverflow 问题,其中一些答案相互矛盾,没有一个明显正确:

  1. x:Reference 的替代品是什么?
  2. XAML 2009 - x:Reference - 使用这个有什么缺点吗?
  3. 何时解析 WPF 中的 x:Reference 以及为什么 XAML 元素顺序会影响它?

最后,我亲自使用了该x:Reference扩展,它似乎在 WPF 应用程序中工作,无论 MSDN 说什么,尽管 Visual Studio 有时会抱怨奇怪的事情(或者可能是 ReSharper),例如标记中的空引用异常。

进入实际问题,

  1. XAML 2009 可以(全部或部分)在 WPF 应用程序中使用吗?
  2. 这些特定的扩展可以用于编写 WPF 应用程序吗?使用它们有什么限制吗?
  3. 为什么对这一切有如此多的困惑?
0 投票
1 回答
308 浏览

c# - 如何在 MarkupExtension 中的 DesignTime 获取静态资源值?

我成功创建了自己的 MarkupExtension,我将其命名为“GtringResource”,它运行良好,但在设计模式下却没有。

我在 ProvideValue(IServieProvider ServiceProvider) 中有以下代码:

我想返回应该在运行时出现的值,因为我从合并的字典中检索值,在 xaml 中看起来像:

我试过这个,但它没有帮助:

0 投票
1 回答
3013 浏览

c# - MarkupExtension 声明中的默认构造函数参数

将这个问题减少到最低限度,考虑这个 MarkupExtension 类......

声明此 Xaml 时...

...您按预期在 TextBlock 中看到“ helloworld ”。到目前为止一切都很好。

但是将构造函数参数更改为此...

...以及与此相关的 Xaml...

产生的错误信息是......

有一种解决方法,即通过将此语句添加到类来链接构造函数...

这将在 TextBlock 中显示“ hellonot provided ”。然而,这也改变了 MarkupExtension 的语义,并且在更大的“真实世界”情况下是不可取的。当使用更复杂的类型或构造函数参数是“动态”类型时,重载的复杂性也会显着增加。此外,例如,完全禁止使用新的“来电者信息”属性。

所以问题是:如何声明 Xaml 以便 Xaml 解析器遵循默认构造函数参数?

0 投票
1 回答
188 浏览

c# - 如何正确重新映射我的 XAML 命名空间?

我创建了一个标记扩展:

接下来,我在 AssemblyInfo 中添加了 XmlnsDefinitionAttribute 以将命名空间 Utils 重新映射到 Default-Namespace,这样我就不需要命名空间来使用标记扩展:

最后,在我的窗口中,我使用了扩展名:

XAML 编辑器不会在任何内容下划线以显示错误,并且 XAML 设计器按预期显示输出(带有“!test!”作为内容的按钮)。

但它不编译!在错误列表中,我的消息是在命名空间http://schemas.microsoft.com/中找不到“Cool”

我做错了什么(摆脱我的扩展名的命名空间)?

0 投票
1 回答
162 浏览

c# - 自定义 MarkupExtension 仅在设计时导致 TypeInitializationException

我正在开发一个自定义标记扩展,其作用很简单:

在扩展构造函数参数(类型)上使用 System.Activator 并实例化它。

在运行时,此扩展按预期运行。

但是在设计时,激活类型时会引发异常。

我已经深入寻找源头,并抓住了鲸鱼:

所以我循环了这个:

并检索到以下消息

找不到 Windows 运行时类型“Windows.ApplicationModel.Core.IFrameworkView”。

找不到 Windows 运行时类型“Windows.ApplicationModel.Core.IFrameworkViewSource”。

由于我的代码在运行时运行良好,我唯一的猜测是 VS(.NET 4.5.1 上的 2013 更新 2)

或者 Xaml 设计器只是在寻找错误的程序集。

关于如何解决这个问题的任何想法,或者任何其他关于这个问题的想法,也许?

非常感谢您抽出宝贵时间。

0 投票
0 回答
64 浏览

xaml - 如何在 Windows 应用商店应用程序中替换 MarkupExtension?

微软似乎完全取消了 Windows Store Apps 中的 MarkupExtension 类。这意味着不再有 x:Static (除其他外)。有什么替代品吗?如果不是,为什么?在 XAML 中提供静态成员的新技术是什么(例如作为绑定中的 ConverterParameters)?

0 投票
4 回答
4185 浏览

c# - 带有标记扩展的字符串格式

我试图string.Format在 WPF 中提供一个方便的功能,以便可以在纯 XAML 中组合各种文本部分,而无需代码隐藏中的样板。主要问题是支持函数的参数来自其他嵌套标记扩展(例如Binding)的情况。

实际上,有一个非常接近我需要的功能:MultiBinding. 不幸的是,它只能接受bindings,但不能接受其他动态类型的内容,例如DynamicResources.

如果我所有的数据源都是绑定,我可以使用这样的标记:

明显的实现StringFormatConveter

我试图实现一个自定义标记扩展,以便语法是这样的:

或者也许只是

但是我被困在ProvideValue(IServiceProvider serviceProvider)参数是另一个标记扩展的情况下的实现。

互联网上的大多数示例都非常简单:它们要么根本不使用serviceProvider,要么 query IProvideValueTarget(大部分)说明了标记扩展的目标是什么依赖属性。在任何情况下,代码都知道应该在ProvideValue调用时提供的值。但是,ProvideValue只会被调用一次(模板除外Binding,这是一个单独的故事),因此如果实际值不是恒定的(例如 for等),则应使用另一种策略。

我查看了BindingReflector 中的实现,它的ProvideValue方法实际上返回的不是真正的目标对象,而是一个System.Windows.Data.BindingExpression类的实例,这似乎完成了所有真正的工作。关于DynamicResource: 它只是返回一个 的实例System.Windows.ResourceReferenceExpression,它关心订阅(内部)InheritanceContextChanged并在适当时使值无效。但是,通过查看代码,我无法理解的是:

  1. BindingExpression/类型的对象ResourceReferenceExpression没有被“按原样”处理,而是被要求提供基础值是如何发生的?
  2. 如何MultiBindingExpression知道底层绑定的值已经改变,所以它也必须使其值无效?

我实际上找到了一个标记扩展库实现,它声称支持连接字符串(这完全映射到我的用例)(项目代码、依赖其他代码的连接实现),但它似乎只支持嵌套扩展库类型(即,您不能在其中嵌套香草)。Binding

有没有办法实现问题顶部提出的语法?它是受支持的方案,还是只能从 WPF 框架内部执行此操作(因为System.Windows.Expression有一个内部构造函数)?


实际上,我使用自定义的不可见帮助 UI 元素实现了所需的语义:

(其中FormatHelper跟踪其子项及其依赖项属性的更新,并将最新结果存储到 中Value),但是这种语法似乎很难看,我想摆脱可视树中的帮助项。


最终目标是促进翻译:像“15 seconds until explode”这样的 UI 字符串自然地表示为可本地化的格式“{0} until explode”(进入 aResourceDictionary并且将在语言更改时被替换)和BindingVM 依赖项表示时间的属性。


更新报告:我尝试使用我在互联网上找到的所有信息自己实现标记扩展。完整的实现在这里([1][2][3]),这里是核心部分:

这似乎适用于嵌套绑定和动态资源,但是在尝试将其嵌套在自身时却惨遭失败,就像在这种情况下targetObjIProvideValueTargetis获得的一样null。我试图通过将嵌套绑定合并到外部绑定([1a][2a])(将多重绑定溢出添加到外部绑定中)来解决这个问题,这可能适用于嵌套的多重绑定和格式扩展,但仍然会因嵌套而失败动态资源。

有趣的是,当嵌套不同类型的标记扩展时,我在外部扩展中得到Bindings 和s,而不是. 我想知道为什么它不一致(以及如何从重建)。MultiBindingResourceReferenceExpressionDynamicResourceExtensionBindingBindingExpression


更新报告:不幸的是,答案中给出的想法并没有解决问题。也许这证明了标记扩展,虽然是相当强大和通用的工具,但需要 WPF 团队更多的关注。

无论如何,我感谢任何参与讨论的人。提出的部分解决方案足够复杂,值得更多支持。


更新报告:标记扩展似乎没有好的解决方案,或者至少创建一个所需的 WPF 知识水平太深而无法实用。

然而,@adabyron 有一个改进的想法,这有助于隐藏宿主项目中的辅助元素(然而,这样做的代价是对宿主进行子类化)。我将尝试看看是否有可能摆脱子类化(使用劫持主机的 LogicalChildren 并为其添加辅助元素的行为出现在我的脑海中,灵感来自同一答案的旧版本)。

0 投票
1 回答
1285 浏览

c# - 以编程方式设置动态资源,但当 ResourceDictionary 更改时 FrameWorkElement 不更新?

我正在使用动态资源词典来翻译我的 GUI 元素。字典在启动时加载,或者可以在运行时更改。效果很好!

现在我必须以编程方式添加一些 GUI 元素..但更改翻译后它们不会更新..

下面是我如何“翻译”XAML 中的 GUI 元素:

这是我添加到 ListBox 的 MenuItem 类:

这是 ListBox 的 XAML 样式:

ListBox 在 XAML 中像这样使用:

启动后,MenuItems 有正确的翻译,所以参考有效?!但是如果我在运行时更改语言,只有 MenuItems 仍然显示旧语言!

如果我以编程方式添加一个 Button 并将其 ReferenceSource 设置为 DynamicResource 它的内容也会在运行时发生变化!

但是我的 MenuItems 在运行时不会改变??!

欢迎任何帮助!

0 投票
0 回答
363 浏览

wpf - 自定义 DataTemplate 属性上的自定义标记扩展

我想知道是否有一种方法可以在从数据模板派生的类型的自定义属性上使用自定义标记扩展?

我需要在我的 DataTemplates 中提供一些额外的信息:

当我将CommonShape标记扩展名放在 DataType 属性上时,一切正常。当我将x:Typemarkupextension 放在 Geometry 属性上时,一切正常。

但是,如果我将自定义标记扩展名放在自定义属性上,我会收到错误消息

有什么解决方法吗?

亚历克斯

编辑:一种可能的解决方法是将标记扩展的值放入资源字典并在 Geometry 属性上使用 StaticResource - 但是,我不确定这是否可以使用 xaml?

0 投票
2 回答
36 浏览

wpf - 如何确定 TargetProperty 是标记扩展中的 DataContext 属性

我正在开发一个标记扩展,它只在分配给 DataContext 依赖属性时才应该工作。

这是由扩展以下列方式强制执行的:

现在,DataContext 很可能将永远保持名为 DataContext,但仍然......

我想要一种更“安全”的方式来确保将扩展分配给 DataContext 依赖属性。

帮助将不胜感激!