WPF 设计器在启动时没有 运行 window 静态构造函数

WPF designer doesn't run window static constructor upon starting up

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

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

  1. 创建新的 WPF 项目。

  2. 创建简单扩展

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

<TextBlock Text="{local:My}" />

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

卧槽?有人可以确认吗(或者这是我的 VS 2015 错误)?

我真的很想知道设计器是如何工作的:如何加载 window,使用哪个 events/methods,等等。似乎 window 构造函数(非静态的)是没有执行(设计时没有发生任何事情),window 是如何创建和显示的?

我知道它在 Visual Studio 2010 年是如何工作的,阅读你的问题后我 假设 同样的原则也适用于 Visual Studio 2015 年。

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

所以需要将My.Test初始化移到自定义控件中,例如:

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

然后在你的 Window:

中使用它
<local:MyTextBlock Text="{local:My}" />

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