我需要在DesignMode中的某个不可预测的时间更改Component的Property的值,并希望将先前未知的新值嵌入到VS编译产生的可执行文件中(而不是将其序列化为某些外部文件) )。
我已经使用文本编辑将新值交换到预构建事件处理程序中的自动生成的组件初始化代码。这样做很好,但对我的口味来说有点哈哈。是否有某种方法来强制VS刷新该文本?
答案 0 :(得分:0)
幸运的是,我找到了一些似乎有效的方法来强制VS自动生成组件的运行时实例的初始化代码,这就是我所追求的(我需要在组件的设计时和运行时之间成功通信 - 简单对于控件,它在运行时使用最新的设计时BackgroundImage位图(你只需要在位图中隐藏属性值,这可以通过使用GetPixel和SetPixel在规则中完全完成)。我考虑了各种黑客,但我遇到了以下,有效且有意义(虽然我可能完全是关于“为什么”的FoS。如果你知道的更好,请教育我):
据我所知,在VS中的一个设计图面上放下一个Component之后(在它在Component Tray中呈现之前),Visual Studio会将它添加到属于Container的一个Component集合中。将它添加到Container的集合中是一系列事件中的一步,其中包括Visual Studio自动生成的Init过程,该过程将在运行时用于组件的根,并且包括组件的公共属性的值。如果您为Component重置Set Site过程(ISite的创建是该序列中的早期步骤),并在Overload中为其中一个公共属性设置一个值,该值将显示在autoregen文本中即可。这几乎是我想要的,除了它只在VS调用Set Site时才有效,而且我需要它在我选择的任何时候发生。
然后我拿了一个传单,并在UI中设置有问题的Property值(在一些不可知的时间),我添加了代码从Container的集合中删除Component然后重新添加它,希望这可能再次引发一系列事件,这些事件将导致VS再次自动生成Init代码,这次使用Property的新值。它显然做到了。耶。
通过决定何时将一个Component重新添加到Container的Components集合中,我现在能够强制VS在自动生成的Init文本中写入我分配给该Component的Public属性的任何值,并因此将值嵌入编译时的可执行文件。
这种技术很容易受到Microsoft实现自动生成的(未记录的)方式的影响,因此可以说是一种黑客行为。但即便记录的功能也可能发生变化。向后兼容性是一个不错的主意,但有时它必须让位。交货是必需的。很高兴知道你的代码在VS的任何未来版本中仍然会很好,但遗憾的是,这不会发生,黑客攻击或不会发生。
当然,记录的功能通常比没有记录的功能更不容易改变。但是,设置所有初始属性值后自动生成的逻辑非常引人注目。微软后来使用相同的序列并不是那么具有逻辑性,但以不同的方式做这件事会花费微软的钱而没有明显的收益。微软及其同类(法律要求)根据底线做出决策。因此,现状似乎是一个不错的选择。