当我加载解决方案并且某个窗口有一个打开的设计器选项卡时,则不执行此窗口静态构造函数。
也许我的结论是错误的(因为我绝对不知道设计师如何加载东西),但这是一个测试用例:
创建新的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;
}
TextBlock
应该在设计师中显示True
。sln
文件)。TextBlock
显示False
。WTF?有人可以确认(或者是我的VS 2015错误)?
我真的很想知道设计师是如何工作的:如何加载窗口,使用哪些事件/方法等等。似乎没有执行窗口构造函数(非静态函数)(在设计时没有发生任何事情) ),窗口是如何创建和显示的?
答案 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,所以我希望它可以代表一个提示来解决你的问题。