ElementHostでホストされているとき、ダイナミックアプリケーションレベルのリソースは、動的ではありません
-
05-09-2019 - |
質問
私は、WinFormsのコンテナにWPFユーザーコントロールをホストしています。今、私はテーマ/スキンのUserControlにできるようにしたいです。これを行うには、私が定義する複数のリソースディクショナリ持っている「スキンを。」私のアプリは、起動時Application.Currentが存在するように、私は「)(新System.Windows.Application」を作成します。テーマを変更するには、古い皮膚が削除され、新しい皮膚は、実行時にアプリケーションレベルのリソースディクショナリにマージされます。しかし、これはユーザーコントロールでdyanamically参照されるリソースのいずれかを変更しません。私はストレートWPFアプリケーションでこれを試してみました、それがうまく働きました。私は何かが足りない、またはすべてでこれを実行しないようにすることができるだろうか?私は、アプリケーションのリソースにスキンを追加した場合、ユーザーコントロールが初期化される前にところで、それは動作しますが、私はそれの後にスキンを変更することはできません。
最も基本的な方法でこれをレポするには:
新しいWinFormsのアプリケーションを作成します。アプリにWPFユーザーコントロールを追加します。これは十分に簡単です。
<UserControl ...>
<Grid>
<Button
Background="{DynamicResource ButtonBG}"/>
</Grid>
</UserControl>
各色のキーButtonBGとともにたSolidColorBrushを有する2つResourceDictionaries、White.xaml及びBlack.xaml(または任意の)を作成します。 Form1.csで、2つのボタンとElementHostを追加します。先ほど作成したユーザーコントロールのインスタンスにElementHostの子を設定します。皮膚を交換するイベントにボタンをアップWIREます:
private void White_Click(object sender, EventArgs e)
{
Application.Current.Resources.MergedDictionaries[0] =
(ResourceDictionary)Application.LoadComponent(
new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));
}
private void Black_Click(object sender, EventArgs e)
{
Application.Current.Resources.MergedDictionaries[0] =
(ResourceDictionary)Application.LoadComponent(
new Uri(@"\WpfThemes;component\Black.xaml", UriKind.Relative)));
}
のProgram.csで、Application.Currentが存在することを確認すると、最初のスキンを設定します:
[STAThread]
static void Main()
{
new System.Windows.Application();
Application.Current.Resources.MergedDictionaries[0] =
(ResourceDictionary)Application.LoadComponent(
new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));
...
}
ホワイトボタンがクリックされたときにさて、私は、ユーザーコントロール内のボタンを白くするとブラック、ボタンがクリックされたとき、私はボタンが黒くなることを期待する期待します。しかし、これは発生しません。
誰もがなぜ知っていますか?解決策はありますか?
の編集のアイデア:。おそらく、テーマの変更は、それがうまくいくときDynamicResourcesの再評価を強制する方法があるかどう
おかげで、 ダスティ
解決
私は、これはWPFの枠組みの中で見落とさ問題かもしれないと思います。
私はリフレクターを経由して伝えることができるものから、Application
リソース辞書が壊滅的に(おそらく、追加、削除、または皮膚を交換するなどの幅広い効果を持つことになります変更)を変更した場合、以上のすべてのループのコードがあることが表示されますアプリケーションと力のWindows
を彼らは彼らのDynamicResources
を再評価します。しかし、ElementHost
sのようなWPFで私が検討する他の要素のトップレベルののは、同じ治療を得ることはありません。これは私が経験してる行動につながるます。
この問題への私の回避策は、手動で個別に私のElementHost
sのすべてを通過し、追加、削除、または皮膚ResourceDictionary
ファイルを交換することです。これは完璧ではないが、それは仕事を取得します。
他のヒント
別の回避策は、ダミーのウィンドウを作成し、コンテンツとしてelementhostの内容を指定することです。 あなたがアプリケーションに見て、それがresourcedictionariesの変化をどのように処理するかを確認する場合は、あなたはそれがウィンドウのみを通知することを見..
あなたは思い出さなければならない唯一のものは、ウィンドウを表示しないことです( - >例外)、およびelementhostを配置するときにそれを閉鎖するので、適切にアプリケーション缶のシャットダウン
。