WPF设计器在启动时不运行窗口静态构造函数

当我加载解决方案并且某个窗口有一个打开的设计器选项卡时,则不会执行此窗口静态构造函数。

也许我的结论是错误的(因为我绝对不知道设计师如何加载东西),但这是一个测试用例:

  1. 创建新的WPF项目。

  2. 创建简单的扩展

public class MyExtension : MarkupExtension { public static bool Test; public override object ProvideValue(IServiceProvider serviceProvider) => Test.ToString(); } 
  1. 添加到主窗口

  

 static MainWindow() { MyExtension.Test = true; } 
  1. 现在编译它( F6 ), TextBlock应该在设计器中显示True
  2. 不要关闭设计师窗口。 关闭VS.
  3. 启动解决方案(双击sln文件)。
  4. 设计器加载窗口后,您将看到TextBlock显示False

WTF? 有人可以确认(或者是我的VS 2015错误)?

我真的想知道设计师是如何工作的:如何加载窗口,使用哪些事件/方法等等。似乎没有执行窗口构造函数(非静态函数)(设计时没有发生任何事情),如何是窗口然后创建和显示?

我知道它如何适用于Visual Studio 2010并阅读您的问题我认为相同的原则也可能适用于Visual Studio 2015。

当控件在XAML设计器内部(关于VS2010,它被称为Cider )作为主控件(即Window )呈现时,其构造函数不会运行。 另一方面,如果控件是在XAML设计器内呈现的另一个控件的子控件,则执行第一个控件的构造函数(即Window内的UserControl )。 你可以在这里阅读更多相关信息。

因此,您需要将My.Test初始化移动到My.Test ,例如:

 public class MyTextBlock : TextBlock { static MyTextBlock() { MyExtension.Test = true; } } 

然后在你的Window使用它:

  

编译项目后,您将在设计器中看到“True”文本。 我再说一遍:它适用于Visual Studio 2010,所以我希望它能代表一个解决问题的提示。