3

Visual Studio 2008 で Windows CE アプリケーションの継承フォームを作成しようとすると、次のエラー メッセージが表示されます。

このファイル内のクラスを設計できないため、デザイナーを表示できませんでした。デザイナーは、ファイル内の次のクラスを検査しました: TestForm --- 基本クラス 'InheritanceTest.BaseForm' を読み込めませんでした。アセンブリが参照され、すべてのプロジェクトがビルドされていることを確認してください。

Visual Studio 2008、バージョン 9.0.30729.1 SP
Microsoft .NET Framework バージョン 3.5 SP1。

コードをまったく記述せず、フォームをカスタマイズしなくても、問題を解決できます。BaseForm が同じプロジェクトにあっても別のクラス ライブラリにあっても違いはありません。プロジェクトは正常にコンパイルされます。問題は、継承されたフォームをデザイナーで表示することです。両方のコンピューターで発生します。私はC#を使用しています。

問題を取得する手順:
ファイル - 新しいプロジェクト - Windows C# - スマート デバイス - CeInheritanceTest (.Net Framework 3.5)
ターゲット プラットフォーム - Windows CE - デバイス アプリケーション
の追加 - 新しい項目 - Visual C# の項目 - Windows フォーム - Windows フォーム - "BaseForm"
ビルド ソリューション
追加 – 新しいアイテム – Visual C# アイテム – Windows フォーム – 継承されたフォーム – "TestForm"
- BaseForm から継承

通常のデスクトップ アプリで同じことを行うと、フォームの継承は問題なく機能します。

この問題について Web を検索したところ、他のユーザーがコンパクト フレームワークを使用してフォームの継承を機能させているように見えます。

私はコードを書いたり変更したりしていないので、基本クラスは抽象的ではなく、PInvoke も使用していません。

助言がありますか?

4

2 に答える 2

2

この問題は、デバイスのバイナリ サイズを抑えるために、.NET CF コントロールのデザイナ メタデータがプロジェクトに自動的に作成およびコンパイルされないために発生します。「デザイン時属性ファイル」と呼ばれるものを手動で作成する必要があります。

基本フォームを含むプロジェクトで、新しい項目を追加します。インストールされたテンプレートのリストから「Design-Time Attribute File」を選択します。.xmta 拡張子が付きます。開くと、xml ファイルであることがわかります。このファイルに追加して、カスタム コントロール/フォームをどのように設計およびシリアル化するかを制御できるオプションが多数あり、これに関する詳細情報を調べることができますが、フォームを設計できるようにしたいだけの場合は、 DesktopCompatible=True という属性を 1 つだけ追加する必要があります。

サンプルは次のとおりです。

<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd">
  <Class Name="CeInheritanceTest.BaseForm">    
    <DesktopCompatible>true</DesktopCompatible>
 </Class>
</Classes>

「クラス」ノードの名前が基本フォームの完全修飾名であることを確認してください。プロジェクトをコンパイルすると、デザイナーで開くことができるはずです。また、プロジェクトの出力フォルダーに、拡張子 .asmmeta.dll を持つ新しいアセンブリがあることにも気付くでしょう。これは、設計可能なコンポーネントを含むライブラリのデザイナー サポートを含むアセンブリです。Visual Studio は、.NET CF コンポーネントを設計しようとすると、これを自動的に読み込みます。

于 2012-06-27T12:42:15.037 に答える
1

私もこの問題の解決策を見つけるのに苦労し、最終的に解決しました。ベース フォームに true を追加する以外に、ベース フォームの Load メソッドに以下を追加する必要があります。

if (this.Site != null && this.Site.DesignMode == true)
{
  // Design Mode
}
else
{
  // Run-time
}

これにより、Load イベント ハンドラーのコードがデザイナーによって実行されなくなります。もう 1 つ、継承されたフォーム Designer.cs で next が追加された場合

this.Load += new System.EventHandler(this.BaseForm_Load); this.Closing += 新しい System.ComponentModel.CancelEventHandler(this.BaseForm_Closing);

これらの行を削除しないと、System.ComponentModel.Design.ServiceContainer.AddService(Type serviceType, ServiceCreatorCallback callback, Boolean Promote) でエラーが発生します。

于 2013-04-18T10:30:26.337 に答える