Как создать свойство UserControl, которое показывает список всех доступных форм? - PullRequest
2 голосов
/ 23 октября 2019

Как мы все знаем, формы, созданные с помощью файла Form.cs

У меня есть свойство типа Form

пример: public Form TargetForm {get;set;}

Мне не нужно использовать Activiator.CreateInstance () для создания формы. Мне просто нужно выбрать форму из файлов Forms.cs и прикрепить ее со свойством TargetForm.

См. снимок экрана http://prntscr.com/pmuxdd

Советы, я думаю, может быть, что-то полезное для читателей: TypeDescriptors, Атрибуты, может быть, которые возвращают список классов в решениях Visual Studio.

Как все мы знаем, API ComponentModel сложно разобратьсяс участием. поэтому, пожалуйста, не расстраивайтесь из-за этого.

1 Ответ

1 голос
/ 27 октября 2019

Существует две службы, которые могут помочь вам во время разработки обнаружить и разрешить все типы решений:

  • ITypeDiscoveryService: Обнаруживает доступные типы во время разработки.

  • ITypeResolutionService: Предоставляет интерфейс для извлечения сборки или типа по имени.

С другой стороны, чтобы показать стандартные значения в раскрывающемся списке в редакторе свойств, вы можете создать TypeConverter:

  • TypeConverter: Предоставляет унифицированный способ преобразования типов значений в другие типы, а также для доступа к стандартным значениям и подвойствам.

Зная о вышеописанных параметрах, вы можетесоздайте пользовательский конвертер типов, чтобы обнаружить все типы форм в проекте и список в раскрывающемся списке.

Пример

В следующем примере я создал пользовательский класс кнопок, который позволяет вам выбирать тип формы в типе дизайна, а затем во время выполнения,если вы нажмете на кнопку, в диалоговом окне отобразится выбранная форма:

enter image description here

Чтобы увидеть версию VB.NET для этого ответа, см. этот пост .

MyButton

using System;
using System.ComponentModel;
using System.Windows.Forms;
public class MyButton : Button
{
    [TypeConverter(typeof(FormTypeConverter))]
    public Type Form { get; set; }

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        if (Form != null && typeof(Form).IsAssignableFrom(Form))
        {
            using (var f = (Form)Activator.CreateInstance(Form))
                f.ShowDialog();
        }
    }
}

FormTypeConverter

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
public class FormTypeConverter : TypeConverter
{
    public override bool GetStandardValuesExclusive
        (ITypeDescriptorContext context)
    {
        return true;
    }
    public override bool CanConvertTo
        (ITypeDescriptorContext pContext, Type pDestinationType)
    {
        return base.CanConvertTo(pContext, pDestinationType);
    }
    public override object ConvertTo
        (ITypeDescriptorContext pContext, CultureInfo pCulture,
        object pValue, Type pDestinationType)
    {
        return base.ConvertTo(pContext, pCulture, pValue, pDestinationType);
    }
    public override bool CanConvertFrom(ITypeDescriptorContext pContext,
        Type pSourceType)
    {
        if (pSourceType == typeof(string))
            return true;
        return base.CanConvertFrom(pContext, pSourceType);
    }
    public override object ConvertFrom
        (ITypeDescriptorContext pContext, CultureInfo pCulture, object pValue)
    {
        if (pValue is string)
            return GetTypeFromName(pContext, (string)pValue);
        return base.ConvertFrom(pContext, pCulture, pValue);
    }

    public override bool GetStandardValuesSupported
        (ITypeDescriptorContext pContext)
    {
        return true;
    }
    public override StandardValuesCollection GetStandardValues
        (ITypeDescriptorContext pContext)
    {
        List<Type> types = GetProjectTypes(pContext);
        List<string> values = new List<string>();
        foreach (Type type in types)
            values.Add(type.FullName);

        values.Sort();
        return new StandardValuesCollection(values);
    }
    private List<Type> GetProjectTypes(IServiceProvider serviceProvider)
    {
        var typeDiscoverySvc = (ITypeDiscoveryService)serviceProvider
            .GetService(typeof(ITypeDiscoveryService));
        var types = typeDiscoverySvc.GetTypes(typeof(object), true)
            .Cast<Type>()
            .Where(item =>
                item.IsPublic &&
                typeof(Form).IsAssignableFrom(item) &&
                !item.FullName.StartsWith("System")
            ).ToList();
        return types;
    }
    private Type GetTypeFromName(IServiceProvider serviceProvider, string typeName)
    {
        ITypeResolutionService typeResolutionSvc = (ITypeResolutionService)serviceProvider
            .GetService(typeof(ITypeResolutionService));
        return typeResolutionSvc.GetType(typeName);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...