私のプロジェクトには、色の異なる複数のテーマがあります。
特定のテキストボックスを特定のフォント/サイズ/などでスキンする必要があります[色の違いはありません]
現在、<asp:TextBox SkinID="skinned" runat="server".../>
各テーマの下のすべての.skinファイルに追加しています。マスター スキンのように、このテキスト ボックス スキンを 1 か所に配置する方法はありますか?
2 に答える
ASP.NET テーマの実装における継承またはカスケードの欠如は、あまり注目されていない残念な制限です。(コントロール定義自体を変更せずに)すべてのテーマでグローバル スキンを使用できるようにするシナリオでは、次の 2 つのオプションがあります。
オプション #1: VirtualPathProvider を使用する
(これの欠点は、リフレクション ベースの回避策なしではコンパイル済みの Web サイトで使用できないことです。)
共有スキンが保持される特別なグローバルテーマの下にGlobal.skinファイルを定義できます。また、他のすべてのテーマの下にもプレースホルダー Global.skin ファイルを作成します。
App_Themes
- Global
\Global.skin (primary)
- ThemeA
\Global.skin (empty placeholder)
- ThemeB
\Global.skin (empty placeholder)
次にVirtualPathProviderで、 App_Themes\*\Global.skinに対するすべてのリクエストを App_Themes\Global\Global.skin に再ルーティングします。
オプション #2: ビルド後のタスクを使用する
これは、プリコンパイルされた Web サイトの制限を回避する上記のソリューションの修正です。実行時に再ルーティングを行う代わりに、 Global\Global.skinを他のすべてのテーマ フォルダーに単純に伝達する ms-build タスクを使用してビルド後に適用できます。
私は両方のオプションを正常に使用しました。
各テーマの下にリストする必要がありますが、テーマごとに 1 つのコントロール定義をリストするだけで済みます。スキンをコントロールの既定の動作にする場合は、SkinID プロパティを指定せずに定義を指定します。