WPF设计师没有';t在启动时运行窗口静态构造函数
本文关键字:启动 运行 窗口 构造函数 静态 设计师 WPF | 更新日期: 2023-09-27 18:29:25
当我加载解决方案,并且某个窗口有一个打开的设计器选项卡时,则不会执行此窗口静态构造函数。
也许我的结论是错误的(因为我完全不知道设计者是如何加载东西的),但这里有一个测试用例:
-
创建新的WPF项目。
-
创建简单的扩展
public class MyExtension : MarkupExtension
{
public static bool Test;
public override object ProvideValue(IServiceProvider serviceProvider) => Test.ToString();
}
- 添加到主窗口
<TextBlock Text="{local:My}" />
和
static MainWindow()
{
MyExtension.Test = true;
}
- 现在编译它(F6),
TextBlock
应该在设计器中显示True
- 不要关闭设计器窗口。关闭VS
- 启动解决方案(双击
sln
文件) - 设计器加载窗口后,您将看到
TextBlock
显示False
WTF?有人能确认吗(或者是我的VS 2015 bug)?
我真的很想知道设计器是如何工作的:窗口是如何加载的,使用了哪些事件/方法,等等。窗口构造函数(非静态构造函数)似乎没有执行(设计时没有发生任何事情),窗口是如何创建和显示的?
我知道它是如何在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,所以我希望它能代表一个解决您问题的提示。