3

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

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

  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. 只要设计器加载窗口,您就会看到TextBlockdisplay False

怎么回事?有人可以确认(或者是我的 VS 2015 错误)吗?

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

4

1 回答 1

3

我知道它在 Visual Studio 2010 中的工作原理并阅读您的问题,我同样的原则也可能适用于 Visual Studio 2015。

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

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

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

然后在你的内部使用它Window

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

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

于 2016-01-08T16:00:09.980 回答