WPF 设计器在启动时没有 运行 window 静态构造函数
WPF designer doesn't run window static constructor upon starting up
当我加载解决方案并且打开了某些 window 的设计器选项卡时,则不会执行此 window 静态构造函数。
也许我的结论是错误的(因为我完全不知道设计器是如何加载东西的),但这里有一个测试用例:
创建新的 WPF 项目。
创建简单扩展
public class MyExtension : MarkupExtension
{
public static bool Test;
public override object ProvideValue(IServiceProvider serviceProvider) => Test.ToString();
}
- 添加到主目录window
<TextBlock Text="{local:My}" />
和
static MainWindow()
{
MyExtension.Test = true;
}
- 现在编译它(F6),
TextBlock
应该在设计器中显示True
。
- 不要关闭设计器window。关闭VS.
- 开始解决方案(双击
sln
文件)。
- 一旦设计器加载 window,您将看到
TextBlock
显示 False
。
卧槽?有人可以确认吗(或者这是我的 VS 2015 错误)?
我真的很想知道设计器是如何工作的:如何加载 window,使用哪个 events/methods,等等。似乎 window 构造函数(非静态的)是没有执行(设计时没有发生任何事情),window 是如何创建和显示的?
我知道它在 Visual Studio 2010 年是如何工作的,阅读你的问题后我 假设 同样的原则也适用于 Visual Studio 2015 年。
当控件在 XAML 设计器中呈现时(关于 VS2010,它被称为 Cider )作为主要控件(即 Window
)它的构造函数不是 运行。另一方面,如果一个控件是在 XAML 设计器中呈现的另一个控件的子控件,则执行第一个控件的构造函数(即 Window
中的 UserControl
)。您可以阅读更多相关信息 here.
所以需要将My.Test
初始化移到自定义控件中,例如:
public class MyTextBlock : TextBlock
{
static MyTextBlock()
{
MyExtension.Test = true;
}
}
然后在你的 Window
:
中使用它
<local:MyTextBlock Text="{local:My}" />
编译项目后,您将在设计器中看到 "True" 文本。我再说一遍:它适用于 Visual Studio 2010,所以我希望它可以作为解决您问题的提示。
当我加载解决方案并且打开了某些 window 的设计器选项卡时,则不会执行此 window 静态构造函数。
也许我的结论是错误的(因为我完全不知道设计器是如何加载东西的),但这里有一个测试用例:
创建新的 WPF 项目。
创建简单扩展
public class MyExtension : MarkupExtension
{
public static bool Test;
public override object ProvideValue(IServiceProvider serviceProvider) => Test.ToString();
}
- 添加到主目录window
<TextBlock Text="{local:My}" />
和
static MainWindow()
{
MyExtension.Test = true;
}
- 现在编译它(F6),
TextBlock
应该在设计器中显示True
。 - 不要关闭设计器window。关闭VS.
- 开始解决方案(双击
sln
文件)。 - 一旦设计器加载 window,您将看到
TextBlock
显示False
。
卧槽?有人可以确认吗(或者这是我的 VS 2015 错误)?
我真的很想知道设计器是如何工作的:如何加载 window,使用哪个 events/methods,等等。似乎 window 构造函数(非静态的)是没有执行(设计时没有发生任何事情),window 是如何创建和显示的?
我知道它在 Visual Studio 2010 年是如何工作的,阅读你的问题后我 假设 同样的原则也适用于 Visual Studio 2015 年。
当控件在 XAML 设计器中呈现时(关于 VS2010,它被称为 Cider )作为主要控件(即 Window
)它的构造函数不是 运行。另一方面,如果一个控件是在 XAML 设计器中呈现的另一个控件的子控件,则执行第一个控件的构造函数(即 Window
中的 UserControl
)。您可以阅读更多相关信息 here.
所以需要将My.Test
初始化移到自定义控件中,例如:
public class MyTextBlock : TextBlock
{
static MyTextBlock()
{
MyExtension.Test = true;
}
}
然后在你的 Window
:
<local:MyTextBlock Text="{local:My}" />
编译项目后,您将在设计器中看到 "True" 文本。我再说一遍:它适用于 Visual Studio 2010,所以我希望它可以作为解决您问题的提示。