2

我对 Treeview 进行了子类化,并在实例化时加载了一个新的 ImageList(以及相关的图像)。

每当我切换到设计器视图时,它也会尝试运行此代码,但是图像不在设计器的路径中,因此它崩溃了。我最终进行了修改以查看当前目录是否为“Visual Studio”,然后什么也不做……但这太难看了。

我发现这发生在其他事情上。如果控件在加载/初始化期间尝试使用仅在程序运行时可用的对象,则设计视图无法调出控件。

但是有没有办法解决这个问题?

我想我希望的是(仅)对 Designer 进行尝试/捕获,并能够忽略我知道会发生的一些错误(如 FileNotFoundException 等)。

谢谢

4

4 回答 4

4

继承自的所有内容System.Windows.Forms.Control都有一个DesignMode属性,该属性返回一个布尔值,指示您是否处于设计模式。您可以使用它来确定何时/何时不加载外部资源。

于 2009-02-03T20:34:18.420 回答
1

通常最好将这些资源的加载移动到 OnLoad 的覆盖,因为它们很少在构造时直接需要。这解决了您看到的问题,并意味着只有至少显示一次的树才能执行这些额外的资源加载步骤。

否则,您可以在设计时通过检查DesignMode属性并采取相应措施来排除这些步骤。

于 2009-02-03T20:36:14.360 回答
1

感谢您为我指出正确的方向。

我曾尝试注册到 OnLoad 事件,但是当设计视图出现时会触发该事件,所以这对我来说不太有效(我做错了什么吗?)。

无论如何,我对 DesignMode 属性进行了更多研究。它只能用于控件,有时您的对象甚至可能不是控件。

所以这是我更喜欢的答案:

if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) {
    // design-time stuff
} else {
    // run-time stuff
}

在这里找到它。

于 2009-02-03T21:12:39.840 回答
1

如果您在设计器中显示带有图像样本的控件库或与其他设计器功能挂钩,那么这是一个很好的模式,但作为一种开发模式,我不确定它是否非常有效。

我建议将您的“业务逻辑”(在这种情况下将某些图像加载到树视图中)转移到树视图控件的范围之外。在您的情况下,我会将逻辑放在控件所在表单的 Load 事件中:

public void Load(object sender, EventArgs e)
{
    string path = "c:\somePath\toAwesome\Images";
    myFunkyTreeView.AddImages(path);
}

对于较大的应用程序,我个人认为您甚至希望将逻辑从表单本身中移出,但这是有争议的措施,因为它需要额外的管道来权衡它提供的灵活性。

于 2009-02-03T21:32:43.450 回答