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

时间:2016-01-08 08:56:59

标签: c# wpf xaml-designer

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

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

  1. 创建新的WPF项目。

  2. 创建简单的扩展程序

  3. public class MyExtension : MarkupExtension
    {
        public static bool Test;
        public override object ProvideValue(IServiceProvider serviceProvider) => Test.ToString();
    }
    
    1. 添加到主窗口
    2. <TextBlock Text="{local:My}" />
      

      static MainWindow()
      {
          MyExtension.Test = true;
      }
      
      1. 现在编译它( F6 ),TextBlock应该在设计师中显示True
      2. 不要关闭设计师窗口。关闭VS。
      3. 启动解决方案(双击sln文件)。
      4. 设计师加载窗口后,您会看到TextBlock显示False
      5. WTF?有人可以确认(或者是我的VS 2015错误)?

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

1 个答案:

答案 0 :(得分:2)

我知道Visual Studio 2010是如何工作的,并且阅读您的问题我假设同样的原则也可以应用于Visual Studio 2015。

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

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

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

然后在Window

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

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