我试图在WinForms应用程序中使用WPF TextBox,同时在另一个程序集中完全封装与WPF相关的细节,但是Forms编辑器并没有简化它。
即,始终将子访问器分配给新的System.Windows.Controls.TextBox,即使访问者使用new替换为另一种数据类型,并使用各种属性进行扼杀,这些属性应该导致忽略它。删除条目会使表单编辑器重新生成它。
该值由控件本身分配,并且还会破坏我希望实现的封装。
有没有办法阻止表单编辑器自动生成Child?
//
// textBox_SpellCheck1
//
this.textBox_SpellCheck1.Location = new System.Drawing.Point(12, 12);
this.textBox_SpellCheck1.Name = "textBox_SpellCheck1";
this.textBox_SpellCheck1.Size = new System.Drawing.Size(200, 100);
this.textBox_SpellCheck1.TabIndex = 0;
this.textBox_SpellCheck1.Text = "textBox_SpellCheck1";
//The Forms editor should not be generating the following line:
this.textBox_SpellCheck1.Child = new System.Windows.Controls.TextBox();
在表单中放置问题时再现问题的示例:
using System;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Controls; //reference PresentationCore, PresentationFramework
using System.Windows.Forms.Integration; //reference WindowsFormsIntegration
using System.Windows.Forms.Design;
namespace wtf
{
[Designer(typeof(ControlDesigner))] //reference System.Design
public class TextBox_SpellCheck : ElementHost
{
private System.Windows.Controls.TextBox textbox;
public TextBox_SpellCheck()
{
textbox = new System.Windows.Controls.TextBox();
base.Child = textbox;
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DefaultValue(0)]
public new int Child { set { } get { return 0; } }
}
}
修改
到目前为止我找到的三个解决方法。这里添加了因为这些都不符合答案。
由于上述封装WPF细节和组件的愿望,这是不可接受的。
充其量烦恼。最好使用表单编辑器创建和管理组件。
只要表单编辑器不重新生成UserControl的设计器代码(如果不是首先手动构建),则可以正常工作。但是,这会增加一层不必要的控件嵌套。
更多信息:
删除TextBox_SpellCheck上的Designer属性会使事情变得更糟,导致在设计器代码中生成单独的托管组件。
使用不同的类型既不会改善问题,也不会使问题变得更糟。
一些例子:
答案 0 :(得分:2)
如果你这样做的话,不确定你会找到办法。 ElementHost按设计使用Child,因为你使用它的确切原因 - 你在Windows窗体控件中托管一个WPF元素。它总是会在设计器中生成您不喜欢的代码。