我已经将Treeview子类化了,并且在实例化时它会加载一个新的ImageList(以及相关的图像)。
每当我切换到设计器视图时,它也会尝试运行此代码,但是图像不在设计器的路径中,因此它会崩溃。我最终放入一个hack来查看当前目录是否是“Visual Studio”,然后什么也不做......但那太难看了。
我发现其他事情正在发生。如果控件在加载/初始化期间尝试使用仅在程序运行时可用的对象,则设计视图无法启动控件。
但是有办法解决这个问题吗?
我想我所希望的是为Designer(仅)提供try / catch,能够忽略我知道会发生的一些错误(比如FileNotFoundException等)。
由于
答案 0 :(得分:4)
从System.Windows.Forms.Control
继承的所有内容都有一个DesignMode
属性,返回一个布尔值,指示您是否处于设计模式。您可以使用它来确定何时/何时不加载外部资源。
答案 1 :(得分:1)
通常最好将这些资源的加载移动到OnLoad的覆盖,因为它们在构造时很少直接需要。这解决了您所看到的问题,并且意味着只有至少显示一次的树才会执行这些额外的资源加载步骤。
否则,您可以在设计时通过检查DesignMode
属性并采取相应行动来排除这些步骤。
答案 2 :(得分:1)
感谢你指点我正确的导演。
我曾尝试注册OnLoad事件,但是当设计视图出现时会触发该事件,因此对我来说不是很有效(我做错了吗?)。
无论如何,我在DesignMode属性中看了一下。它只能用于控件,有时你的对象甚至可能不是一个控件。
所以这是我更喜欢的答案:
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) {
// design-time stuff
} else {
// run-time stuff
}
找到它here。
答案 3 :(得分:1)
如果您在设计器中显示带有图像样本的控件库或者将其他设计器功能挂钩,那么这是一个很好的模式,但作为开发模式,我不确定它是否非常有效。
我建议将你的“业务逻辑”(在这种情况下,将某些图像加载到树视图中)转移到treeview控件的边界之外。在您的情况下,我将逻辑放在控件所在的窗体的Load事件中:
public void Load(object sender, EventArgs e)
{
string path = "c:\somePath\toAwesome\Images";
myFunkyTreeView.AddImages(path);
}
对于较大的应用程序,我个人认为您希望将逻辑从表单中移除,但这是值得商榷的措施,因为它需要额外的管道作为这种灵活性的折衷。