WPF设计器在启动时不运行窗口静态构造函数
当我加载解决方案并且某个窗口有一个打开的设计器选项卡时,则不会执行此窗口静态构造函数。
也许我的结论是错误的(因为我绝对不知道设计师如何加载东西),但这是一个测试用例:
-
创建新的WPF项目。
-
创建简单的扩展
public class MyExtension : MarkupExtension { public static bool Test; public override object ProvideValue(IServiceProvider serviceProvider) => Test.ToString(); }
- 添加到主窗口
和
static MainWindow() { MyExtension.Test = true; }
- 现在编译它( F6 ),
TextBlock
应该在设计器中显示True
。 - 不要关闭设计师窗口。 关闭VS.
- 启动解决方案(双击
sln
文件)。 - 设计器加载窗口后,您将看到
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,所以我希望它能代表一个解决问题的提示。