如何在自定义设计器中使用Visual Studio资源选择器对话框

时间:2017-09-16 18:49:05

标签: c# .net vb.net winforms windows-forms-designer

将.NET 4.0与Visual Studio 2017和Visual Basic .NET一起使用(也可以在C#中完成),我创建了一个WinForms应用程序。作为应用程序的一部分,我通过添加一个新类并从System.Windows.Forms.Control继承来创建一个自定义控件

Public Class MyControl
    Inherits System.Windows.Forms.Control
End Class

如果我将自定义控件添加到表单,我可以使用属性窗口添加BackgroundImage。在属性窗口中,如果我单击BackgroundImage属性,它将显示省略号按钮。单击该按钮将打开“选择资源对话框”窗口。

enter image description here

我现在通过继承System.Windows.Forms.Design.ControlDesigner为控件创建了一个自定义设计器。我还创建了在设计视图中双击控件时弹出的设计器表单。在设计器表单上,我希望能够使用上面显示的Visual Studio中的相同“选择资源”对话框选择背景图像。我一直无法找到选择资源对话框的位置。我怀疑是在下面的程序集中,但我没有找到它。

Microsoft.VisualStudio.Design.dll

有人可以告诉我Visual Studio使用的“选择资源”对话框的完全限定名称空间以及它所在的程序集吗?

1 个答案:

答案 0 :(得分:0)

您可以使用代码在设计时显示所有属性的属性编辑器。为此,您可以找到EditorServiceContext程序集中的内部System.Design,然后通过将您的控件设计器,要编辑的控件和属性名称传递给它来调用其EditValue方法。编辑。

示例

您可以在此存储库中找到完整的源代码,例如:

示例的核心部分是设计器类:

using System.ComponentModel.Design;
using System.Linq;
using System.Windows.Forms.Design;
public class MyControlDesigner : ControlDesigner
{
    DesignerVerbCollection verbs;
    public override DesignerVerbCollection Verbs
    {
        get
        {
            if (verbs == null)
            {
                verbs = base.Verbs;
                verbs.Add(new DesignerVerb("Show Select Resource", 
                    (s, e) => ShowSelectResource()));
            }
            return verbs;
        }
    }
    public void ShowSelectResource()
    {
        var editorServiceContext = typeof(ControlDesigner).Assembly.GetTypes()
            .Where(x => x.Name == "EditorServiceContext").FirstOrDefault();
        var editValue = editorServiceContext.GetMethod("EditValue",
            System.Reflection.BindingFlags.Static |
            System.Reflection.BindingFlags.Public);
        editValue.Invoke(null, new object[] { this, this.Component, "SomeProperty" });
    }
}