2

私が持っている別の標準フォーム (透過性をサポートするフォーム) に基づくフォームがあります。これは、実行時に独自の型で識別されます。ただし、デザイナーでは、デザイナー コントロール スタックの最上位で親型として識別されるデザイン時に表示されるいくつかのメッセージ ボックス出力を設定しました。

サンプルコード

Public Class SpecificForm
    Inherits GenericForm
    Implements IUsefulInterface
    ...
End Class

Public Class GenericForm
    Inherits System.Windows.Forms.Form
    ...
End Class

親が正しく描画する方法を知るように求めるフォームのコントロールがあります。特定のタイプが描画情報を運ぶインターフェースを実装しているため、実行時には問題なく動作します。親利回りの循環

"Control1" As System.Windows.Forms.Control, parented by
"MainForm1" As SpecificForm, parented by
Nothing

親の歩留まりを循環する設計時のように

"Control1" As System.Windows.Forms.Control, parented by
"MainForm1" As GenericForm, parented by
"" As System.Windows.Forms.Design.DesignerFrame+OverlayControl, parented by
"" As System.Windows.Forms.Design.DesignerFrame, parented by
"" As System.Windows.Forms.Control, parented by
Nothing

実行時に MainForm は SpecificForm 型として識別され、設計時には当然のことながらデザイナーによってホストされますが、現在は GenericType として識別されます。

4

2 に答える 2

1

あなたがこの質問をしているという事実を尊重します。しかし、誤解しないでいただきたいのですが、この質問はややナイーブな表現です。あなたは、ほとんどの人が知らない現象を観察しました (WinForms プログラマーとしての成熟に近づいていることを祝福します! -- 皮肉ではなく、真面目な話です..)

さて、あなたの質問は少しナイーブだと言いましたが、それは「なぜ円はこんなに丸いのですか?」と尋ねるようなものだからです. 次の説明は少し冗長に聞こえるかもしれませんが、それだけです。

設計時に、 のデザイナではSpecificForm、 のインスタンスを「実行」しているのでSpecificFormはなく、 に基づいてプロトタイプを設計して GenericFormおり、これは事実上、「実行」しているコントロールのタイプです (つまり、ランタイム コンテキスト)。

繰り返しますが、 の設計者には「実行中」SpecificFormのインスタンスはありませんが、 のインスタンスがあります。デザイナーにはインスタンスが存在しませSpecificFormGenericFormSpecificForm

この正確な説明を使用して、別のユーザーが見ているものを理解できるようにしました: https://stackoverflow.com/a/12499053/1426433。しかし、あなたは自分でそれに気づきました。

于 2012-09-19T17:29:25.187 に答える
0

また、表示されている内容をさらに文書化するために、次の実験を行うことができます。

UserControlと呼ばれる単純なものを作成しますFooUserControl。これは、作成された場所のスタックトレースを含むメッセージボックスを表示するために使用されます。

using System;
using System.Windows.Forms;

namespace Test {
    public partial class FooUserControl : UserControl {
        public FooUserControl() {
            InitializeComponent();
            MessageBox.Show(Environment.StackTrace);
        }
    }
}

プロジェクトをビルドし、フォームデザイナを開きます。たとえば、フォームのデザイナを開きますFooForm(これは、自分または作成している他のコントロールのデザイナである可能性があります)。これをデザイナにSpecificFormドラッグアンドドロップした瞬間FooUserControl表面には、次のようなメッセージボックスが表示されます。

ここに画像の説明を入力してください

そして、このデザイナーを再度開くたびに、次のようなものが表示されます。

ここに画像の説明を入力してください

一方、アプリケーションを「実行」するたびに、次のようなものが表示されます。

ここに画像の説明を入力してください

つまり、Windowsフォームデザイナは、と呼ばれるそのようなメソッドを実行していませんFooForm.InitializeComponent()。このメソッドは実行時にのみ実行されます。これは、設計されているコントロールのコンストラクターが実行されたときにのみ実行され、次にがが呼び出されるためFooForm.InitializeComponent()です。

信じられないかもしれませんが、設計者が行っているのは、基本的にFooForm.Designer.csファイルの行をステートメントごとに解析することです(おそらくCodeDOMを使用)。

これらの説明がお役に立てば幸いです。

于 2012-09-19T17:58:07.020 に答える