表单编辑器自动将子控件添加到WPF Integration ElementHost

时间:2013-09-19 15:29:48

标签: c# visual-studio-2010 winforms-interop

我试图在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; } }
    }

}

修改

到目前为止我找到的三个解决方法。这里添加了因为这些都不符合答案。

  • 让Forms编辑器负责TextBox的分配。

由于上述封装WPF细节和组件的愿望,这是不可接受的。

  • 不要让表单编辑器管理组件。

充其量烦恼。最好使用表单编辑器创建和管理组件。

  • 将TextBox_SpellCheck(ElementHost)放在UserControl中。

只要表单编辑器不重新生成UserControl的设计器代码(如果不是首先手动构建),则可以正常工作。但是,这会增加一层不必要的控件嵌套。

更多信息:

删除TextBox_SpellCheck上的Designer属性会使事情变得更糟,导致在设计器代码中生成单独的托管组件。

使用不同的类型既不会改善问题,也不会使问题变得更糟。

一些例子:

  • ParentControlDesigner仍会生成子元素。
  • ScrollableControl仍会生成子元素。
  • DocumentDesigner会抛出导致表单编辑器无法使用的异常。
  • System.ComponentModel.Design.ComponentDesigner将控件生成为间接可用的组件,例如通过Forms编辑器添加数据源或其他任何内容。

1 个答案:

答案 0 :(得分:2)

如果你这样做的话,不确定你会找到办法。 ElementHost按设计使用Child,因为你使用它的确切原因 - 你在Windows窗体控件中托管一个WPF元素。它总是会在设计器中生成您不喜欢的代码。