WPFクラスライブラリのアセンブリ全体/ルートレベルのスタイル
質問
WPFをサポートするC#(2008 / .NET 3.5)クラスライブラリアセンブリがあります(この記事))。
いくつかのウィンドウを作成しましたが、現在、それらに共通のスタイルセットを作成します。ただし、(WPFアプリの代わりに)クラスライブラリであるため、これらのスタイルをグローバルアクセス用に保存するapp.xaml(およびそれに含まれるApplication&対応するApplication.Resources)はありません。
そのため: app.xamlがない場合に、アセンブリ内のすべてのxamlファイルで表示されるトップレベルのスタイル定義セットを作成するにはどうすればよいですか(上記を参照)?そして/または、作業中のapp.xamlをクラスライブラリに追加することは可能ですか?
FYI、ResourceDictionary.xamlファイルにResourceDictionaryを作成して、" Window.Resources"内の各ウィンドウに含めました。ブロック。これは、ボタンなどのスタイリングを解決するために判明しましたが、ウィンドウを囲むためではありませんでした。 Windowの開始ブロックに Style =" {StaticResource MyWindowStyle}"
を配置すると、VS Designウィンドウにコンパイルして表示されますが、実際の実行時に解析例外(MyWindowStyle見つからなかった;問題の行の後に辞書が含まれているとVisual Studioが推測しているが、CRLはより順次処理を行うため、ResourceDictionaryをまだロードしていない)
アイデアに感謝しますが、まだ行っていません...どうやらクラスライブラリは暗黙的にgeneric.xamlの使用をサポートしていません。クラスライブラリプロジェクトにgeneric.xamlを追加し、ビルドアクションを" Resource"に設定しました。次のものが含まれます。
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type Window}" x:Key="MyWindow">
<Setter Property="Background" Value="Black"/>
</Style>
</ResourceDictionary>
テーマを使用したいウィンドウxamlは次のようになります:
<Window x:Class="MyAssembly.ConfigureGenericButtons"
x:ClassModifier="internal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Style="{StaticResource MyWindow}"
Title="ConfigureGenericButtons">
...Buttons, etc...
</Window>
VS DesignウィンドウはMyWindowスタイル(つまり、黒の背景)を使用したウィンドウを表示しませんが、正常にコンパイルされて起動します。ただし、このクラスライブラリを含むアプリがこのウィンドウを表示する呼び出しを行うと、XamlParseExceptionが発生します:
「{MyWindow}」という名前のリソースが見つかりません。
また、Styleパラメーターを省略して、ウィンドウがデフォルトでスタイルを使用するかどうかを確認しました(generic.xamlのx:Keyを含む場合と含まない場合の両方を試しました)。エラーはありませんが、generic.xamlで定義されたものは表示されませんでした。
ここで何か間違ったことをしていますか、またはウィンドウで一般的なカスタムスタイルを使用できるようにする方法に関する他のアイデアですか(つまり、各ウィンドウのxamlでスタイルを定義する必要はありません)アプリケーションではありませんか?
解決
追加を試してください
Style={DynamicResource MyStyle}
この場合、StaticResourceは使用できません。
他のヒント
これはテーマ設定の仕事のように聞こえます。
-
/themes/generic.xaml
ResourceDictionaryをプロジェクトに追加します。 - AssemblyInfo.csに次を追加します。
[assembly:ThemeInfo(ResourceDictionaryLocation.None、ResourceDictionaryLocation.SourceAssembly)]
- ?
- 利益!
ジェネリックに追加するリソースはすべてのコントロールで使用されます。また、 themes
ディレクトリに正しいテーマ名を持つResourceDictionaryファイルを含めることにより、プロファイル固有のテーマ(Luna、Aeroなど)を作成できます。
詳細情報へのリンク:カスタムテーマの作成と適用
app.xamlがない場合でも、アプリケーションレベルのリソースに読み込むことができますが、これを行うには(xamlではなく)コードを記述する必要があります...
void LoadIt()
{
ResourceDictionary MyResourceDictionary = new ResourceDictionary();
MyResourceDictionary.Source = new Uri("MyResources.xaml", UriKind.Relative);
App.Current.Resources.MergedDictionaries.Add( MyResourceDictionary )
}
例については、このサイトをご覧ください。
http:// ascendedguard .com / 2007/08 / one-of-nice-features-about-wpf-is-how.html
博士WPF(または以前はWPF博士として知られていた人)には、優れた件名に投稿。
アプリケーションオブジェクトを作成してリソースを追加する投稿からの抜粋です。
if (Application.Current == null)
{
// create the Application object
new Application();
// merge in your application resources
Application.Current.Resources.MergedDictionaries.Add(
Application.LoadComponent(
new Uri("MyLibrary;component/Resources/MyResourceDictionary.xaml",
UriKind.Relative)) as ResourceDictionary);
}
アセンブリは相互運用機能を介してホストされるため、ShutdownModeを次のように設定し、終了したらシャットダウンする必要がありました。
new Application() { ShutdownMode = ShutdownMode.OnExplicitShutdown };
それは魅力のように機能しました。
Window.Resourceにロードすると、ディクショナリはそのウィンドウの子でのみ使用可能になります。ウィンドウとその子で使用できるようにする必要があります。
app.xamlファイルにロードしてみてください。これにより、ウィンドウレベルのリソースではなく、アプリケーションレベルのリソースになります。
それで、多くの時間を費やした後、私はついにこれを理解しました。方法は次のとおりです。
- WPFコントロールライブラリで、
themes
という名前の新しいフォルダーを追加します。 -
themes
フォルダー内に、generic.xaml
という名前のリソースディクショナリーを追加します。 -
generic.xaml
内で、次の構文を使用してリソースを追加します。<SolidColorBrush x:Key="{ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}" Color="Blue" />
-
コントロールで、次の構文を使用してこのリソースにアクセスします。
Background="{StaticResource {ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}}"
注意事項:
- 通常、ステップ1と2は、新しいWPFコントロールライブラリを作成するときにVisual Studioによって自動的に実行されます。
-
ComponentResourceKey
の最初のパラメーターの目的を完全には理解していませんが、必須です。このリソースを消費するコントロールの名前を使用します。 - 私の場合、Visual Studioのデザイナーはリソースを見つけることができませんでした。キャッシュの問題である可能性がありますが、わかりません。ただし、実行時にはきちんと動作します。
- この構文の詳細については、このMSDN記事をご覧ください。
これにより一部の生活が楽になることを願っています。