gpt4 book ai didi

c# - WPF 设计器在启动时不运行窗口静态构造函数

转载 作者:行者123 更新时间:2023-11-30 16:50:42 24 4
gpt4 key购买 nike

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

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

  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. 一旦设计器加载窗口,您将看到 TextBlock 显示 False

WTF?有人可以确认吗(或者这是我的 VS 2015 错误)?

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

最佳答案

我知道它在 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,所以我希望它能为您提供解决问题的提示。

关于c# - WPF 设计器在启动时不运行窗口静态构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34672949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com