主题资源字典中的EventSetters

15

MSDN关于事件设置器的说明:

事件设置器不能用于包含在主题资源字典中的样式中。这是因为运行时的主题资源字典通常是松散的二进制XAML(BAML)文件,并没有任何范围定义,其中附带的代码后备可以存在。

这得到了此SO问题的第一个答案的证实,该回答指出:

资源xaml不能有一个代码后备文件,它们通常被称为“松散的xaml”。您可以在EventSetter的msdn上阅读有关此问题的信息。

然而,我仍然不明白事件设置器的限制。我已经尝试在资源字典中使用代码后备文件。我为在样式中定义的模板中包含的控件的事件分配了一个事件处理程序 - 并且它起作用了。

在同一资源字典中的样式中添加事件设置器却会导致异常。

我是否遇到了一个特殊情况,使它偶然工作?

或者说,在模板中设置事件处理程序总是有效的,但如果是这样,为什么不能在同一资源字典中的样式中使用事件设置器呢?

我的问题归结为:

MSDN关于主题资源字典通常是松散二进制XAML - 在什么情况下经常发生,具体含义是什么?


你在主题资源字典中使用了CodeBehind吗? - Pavel Voronin
@voroninp:是的;请参考带有语句“我已尝试使用代码后台文件来作为资源字典”的段落。 - O. R. Mapper
ResourceDictionary可以拥有一个codebehind。这种方法在MacDonald的书-Pro WPF in C# 2010中有描述。我认为禁用的样式事件集只是按设计来实现的。但我同意你所说的不清楚的原因。 - Pavel Voronin
如果是这样,那么你是否可以简单地创建一个模板,然后在主题中引用它呢?如果你不需要解决方案,只是想要理解的话,很抱歉。我放弃了理解 MFC 中的 Microsoft,现在只是努力使它工作。 - Lee Louviere
1个回答

2
这意味着它是独立编译的,没有在名称空间或代码后面编写。换句话说,松散的xaml文件没有代码部分,例如可以从数据库中读取为文本,或者作为文本动态生成并加载,而不需要任何编码关联。至于这是否是一个有效的理由,那就取决于每个开发人员,但这就是松散的xaml文件的含义。
编辑:
根据您的评论,我想他们特别指的是资源和样式,因为这些是最常见的“松散文件”,一般大多数人不会将它们与代码文件联系起来。个人认为这是一种应对措施。他们本可以轻松地添加一个Loose=True属性来解决这个问题。
实际上,问题不在于松散文件的数量或使用频率,而在于制定了一条规则来弥补缺失的功能。如果他们只是说因为我们还没有为此构建支持,所以你不能做x、y、z,那么会更容易些,而不是说这是因为某些任意数量的松散xaml文件。

抱歉,也许问题不太清楚 - 我知道什么是“松散的XAML”。我的问题是关于“经常”这个词; 在引用的上下文中,“经常”是什么意思?换句话说,具体是指什么时候? - O. R. Mapper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接