8

メインフォームをユーザーに表示する方法を柔軟にする必要があるアプリケーションがあります。ユーザーによっては、フォームがわずかに異なる必要があり、追加のボタンがあちこちにあったり、その他のニュアンスがあったりします。コントロールなどを明示的に削除または追加するコードを書くのをやめるために、問題を解決するために視覚的な継承に目を向けました.正当な理由もなく VS でテーマ自体をレンダリングするなど - 開発者と Microsoft がある程度 Visual Inheritance の実践を避けているように感じます - これを確認できますか?

よろしく。

4

6 に答える 6

6

2005 年のデスクトップ デザイナーの問題はほぼ解決されたと思います。

  • 抽象コントロール型なし
  • どのような形式のコンストラクター引数もありません
  • 初期化は Ctor ではなく Form_Load に移動
  • 内部に配置されているユーザーコントロール/フォームと同じプロジェクトにコントロールはありません
  • すべてのドキュメントを閉じる -> 消去 -> 再構築
  • VS を再起動する

上記のすべてを行う限り、うまくいくと思ったようです.....ほとんど。

于 2008-09-08T11:43:39.397 に答える
3

私は (確かにすぐに廃止される予定の) MCAD に向けて勉強しており、WinForms 要素の一部は Visual Inheritence でした。

個人的には大きな問題はありませんでしたが、考慮すべき考慮事項があります。

私にとって、主な問題は常に初期化にあります..デザイナーは実行時に行うのと同じ方法でフォームをインスタンス化できない/しないことを覚えておく必要があります(同様に、Web開発ではこれを行うことができないため、注意が必要ですカスタム コントロール レンダリングを使用)。

また、フォームが変更されると、フォームへの変更を継承する子フォームに反映させるために、プロジェクトを完全に再構築する必要があります。

私は個人的に、それが「避けられた」ことを示唆する証拠を見たことがありません. 私の知る限り、可能な場合はコードの再利用を行うことをお勧めします。視覚的な継承がそれを提供します。

サンプルコードを使用して、実際に発生している問題について新しい質問を作成することをお勧めしますか? 次に、それを見て、機能するかどうかを確認し、理由を説明します:)

于 2008-09-08T11:34:00.933 に答える
2

これでVS2005でいくつかの問題が発生しました。ほとんどの場合、デザイナでのフォーム オブジェクトの構築に問題がありました。フォーム コンストラクターなどからデータベースにアクセスしようとするコードに問題がありました。

Visual Studio の 2 番目のインスタンスを開始し、デバッガーで最初のインスタンスを読み込むことで、このような問題をデバッグできます。コードにブレークポイントを設定すると、最初のインスタンスでデザイナーで何が起こるかをデバッグできます。

私が覚えているもう 1 つの問題は、フォーム クラスのジェネリックです。

public class MyForm<MyObject> : Form

これはうまくいきません

于 2008-09-08T12:16:16.653 に答える
1

Visual Studio でこのような問題に遭遇することがよくあります。多くの場合、MSVS フォーム デザイナーはフォームを正しくレンダリングできません。WinForms を使っていた頃は、複雑なシナリオを実現するためにあらゆる種類の奇妙なトリックを実行する必要がありました。ただし、視覚的な継承を使用することは非常に有益であり、MSVS デザイナーのバグに関係なく捨てるべきではないと思います。

于 2008-09-08T11:05:37.400 に答える
1

この問題を回避する方法を見つけたと思います。

親フォームで Form_Load イベントをフックしないでください。デザイナーが壊れます。

また、親フォームの Visual Studio から既定の空のコンストラクターを削除しないでください。依存性注入が必要な場合は、別のコンストラクターを作成します。

このような:

public ProductDetail()
{
    InitializeComponent();
}

public ProductDetail(ISupplierController supplierController) : base()
{
    InitializeComponent();
    this.supplierController = supplierController;
}

その後、継承されたフォームからこれを行うことができます。

public NewProduct(ISupplierController supplierController)
    : base(supplierController)
{
    InitializeComponent();
}

これはこれまでのところうまくいきましたが、奇妙なデザイナーの問題もいくつかありました。

乾杯、ダニエル

于 2008-11-03T14:50:32.297 に答える
0

これを読んでください:http://cs.rthand.com/blogs/blog_with_righthand/archive/2005/11/10/186.aspx

私の知る限り、Visual Inheritance と、デザイン要素のコレクションに依存するオブジェクト (通常はグリッド コントロールなど) にはまだ問題があります。継承されたフォーム/ユーザーコントロールなどのGridView。ただし、TextBox、Form、UserControl、Panelなどの他のコントロールは期待どおりに機能するはずです。

これまでのところ、VI でサード パーティのグリッド コントロールを使用しても問題はありませんでしたが、注意が必要です。特に、コレクションからアイテムを削除することは避ける必要があります。

于 2010-01-29T12:22:57.947 に答える