WPF设计师没有';t在启动时运行窗口静态构造函数

本文关键字:启动 运行 窗口 构造函数 静态 设计师 WPF | 更新日期: 2023-09-27 18:29:25

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

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

  1. 创建新的WPF项目。

  2. 创建简单的扩展

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

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

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

WTF?有人能确认吗(或者是我的VS 2015 bug)?

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

WPF设计师没有';t在启动时运行窗口静态构造函数

我知道它是如何在Visual Studio 2010中工作的,阅读您的问题后,我认为同样的原则也可以应用于Visual Studio 2015。

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

因此,您需要将My.Test初始化移动到自定义控件中,例如:

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

然后在Window:中使用

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

编译项目后,您将在设计器中看到"True"文本。我重复一遍:它适用于VisualStudio2010,所以我希望它能代表一个解决您问题的提示。