1

一般的な基本フォームから継承し、期待どおりに実行されるフォームがありますが、デザイナーには表示されません。

私はネットを探し回って、SOに関するいくつかの質問と、カスタム TypeDescriptionProvider を使用するように言っているいくつかのブログ記事を見つけました。私が見つけた記事は2008年から2010年頃のものです。

Visual Studio Whidbey を使用して抽象的なフォームを設計する

汎用フォームと VS デザイナー

これは、2013 年 9 月に VS2012、.NET 4.0 を使用する方法ですか?

4

2 に答える 2

0

抽象基本クラスで機能する TypeDescriptionProvider を使用した同じメカニズムは、汎用クラスでも機能するはずだと多くの人が主張していますが、実際に機能している人にまだ出会っていません。

TypeDescriptionProvider ベースのソリューションをジェネリック基本クラスで機能させるために何時間も費やしましたが、抽象基本ケースとは異なり、デザイナーは指定された型記述子プロバイダーを使用しようとしていないようです (1 つの VS インスタンスを使用してデバッグすることによって検証されます)。別の VS インスタンスのデザイナー)。

機能させることは可能かもしれませんが、一般的なケースでは、属性ソリューションはそのままでは機能しません。OPの参照記事(ここから逐語的にコピーされたようです)の著者でさえ、ジェネリックについてテストしていないことをコメントで認めています。

運が良かった人はいますか?

于 2014-04-30T10:59:15.227 に答える
0

常に機能するソリューションではありませんが、これでほとんどの場合は機能します。

class GenericControlDescriptionProvider : TypeDescriptionProvider
{
    public GenericControlDescriptionProvider()
        : base(TypeDescriptor.GetProvider(typeof(ContainerControl)))
    {
    }

    public override Type GetReflectionType(Type objectType, object instance)
    {
        if (objectType.IsGenericType)
        {
            return objectType.BaseType;
        }

        return base.GetReflectionType(objectType, instance);
    }

    public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
    {
        if (objectType.IsGenericType)
        {
            objectType = objectType.BaseType;
        }

        return base.CreateInstance(provider, objectType, argTypes, args);
    }
}

私がチェックしているのは、ターゲット型がジェネリックかどうかだけです。そうであれば、その基本クラスを使用してください。ここでの前提は、基底クラスがデザイナーにとって適切なインスタンス化可能なクラスであることです。例:

[TypeDescriptionProvider(typeof(GenericControlDescriptionProvider))]
public abstract class FormBase<TViewModel> : Form

VS 2017、.NET 4.5.2 でテスト済み。問題は、ソリューション (プレゼンテーション プロジェクトを読む) を VS プロセスの存続期間中に一度ビルドする必要があることです。VS を起動するたびに、一度ビルドする必要があります。それだけです。

于 2020-01-07T13:26:25.503 に答える