5

我正在开发一个 VS 2012 Express WPF 项目(C# 代码隐藏),我收到错误“在属性表达式中检测到循环”。现在在我继续之前,我知道我为什么会得到它 - 我只是不确定该怎么做,或者是否需要处理它,因为即使它出现在错误列表中并带有蓝色下划线,程序编译并运行得很好。当然,我已经用 Google 搜索过,结果各不相同。我的问题是两部分的,但首先,这是纲要:

违规代码:

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
<!-- setter properties -->
</Style>

如您所见,它是 Button 的一种样式,指的是导致问题的 Button。我读到的第一个解决方法涉及像这样分离代码:

<Style x:Key="ButtonStyleToApply" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
    <!-- setter properties -->
</Style>
<!-- and in another style dictionary, -->
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyleToApply}"/>

...然后这两个样式集进入不同的字典。显然,这也没有任何好处 - VS 仍然嗅出我在做什么,但它仍然可以编译并运行良好。现在这是另一种解决方法:

“Visual Studio 中的 XAML 设计器中存在一些架构更改,这已使这种情况倒退。我们将在未来努力改善这种体验,但现在您可以通过不在应用程序对象(App. xaml) 而是在本地文档 (MainPage.xaml) 中定义它们”

这是在技术支持查询中发布。(Connect.Microsoft.Com)

但我相信每个人的亲身体验。我的程序员同事能告诉我什么?我的问题是两部分的。1.如果程序正在编译,我什至需要解决这个问题吗?2.如果我很高兴,有没有办法告诉VS忽略它?我知道我或 VS 忽略它可能被认为是“不好的做法”,但除此之外......?

4

1 回答 1

13

您使用的语法没有任何问题;定义基于现有隐式样式的隐式样式是合法的。您提供的代码示例在 VS 2010 中为我工作,没有任何投诉,但在 VS2012 中产生了有问题的错误。

由于它在两个版本中也都能正常编译和运行,我怀疑问题出在 VS 2012 XAML 设计器支持上。这对您来说有多大意义取决于您对 WPF 视图的设计器渲染的依赖程度。(例如,我通常隐藏呈现的视图并专门在 XAML 视图中工作。)如果您确实使用该功能,您可能会注意到并非所有属性都在设计时正确设置。当然,由于 setter 通常在运行时才产生太大影响,因此您可能永远不会注意到其中的区别。

而且,正如您的问题正确指出的那样,即使微软也已将其确定为 VS2012 中的回归,这强烈表明他们不希望错误发生,并且可能会在将来的某个时候修复设计器错误。

于 2013-02-12T21:54:25.283 回答