質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2416閲覧

他のxaml.cs上からMainWindow.xamlのDynamicResourceをバインドさせるには

tride

総合スコア68

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2019/11/19 11:06

他のxaml.cs上からMainWindow.xamlのDynamicResourceをバインドさせるにはどうすればいいでしょうか。
ソース上では、Language.xaml.csの以下thisの部分です。

以下Language.xaml.cs上の該当箇所自体は問題なく読み込んでくれるのですが、MainWindow.xamlのlanguageへのバインドのさせ方が分からず詰まっています。

C#

1this.Resources.MergedDictionaries.Add(dictionary); //これではLanguage.xamlでバインドされる 2//MainWindow.Resources.MergedDictionaries.Add(dictionary); //エラー

尚、以下サイト3つ目を参考にしています。
https://tocsworld.wordpress.com/2014/08/13/%E5%A4%9A%E8%A8%80%E8%AA%9E%E5%AF%BE%E5%BF%9Cc%E3%80%81wpf%E7%B7%A8/


<StringResource.en-US.xaml>

xaml

1<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 2 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 3 xmlns:system="clr-namespace:System;assembly=mscorlib"> 4 <system:String x:Key="language">Language</system:String> 5 6</ResourceDictionary>

<MainWindow.xaml>

xaml

1 2 <Grid> 3 <StackPanel x:Name="FooterColum"> 4 <TextBlock Text="{DynamicResource language}" /> 5 6 </StackPanel> 7 </Grid>

<Language.xaml>

xaml

1 2 <Grid x:Name="LanguageMenuPannel"> 3 4 <StackPanel> 5 <RadioButton x:Name="radioButton_ENG" Content="English" Height="22" VerticalContentAlignment="Center" Checked="RadioButtonENG_Checked"/> 6 <RadioButton x:Name="radioButton_JPA" Content="日本語" Height="22" VerticalContentAlignment="Center" Checked="RadioButtonJPA_Checked"/> 7 <TextBlock x:Name="TestTextBox" Text="{DynamicResource language}" /> 8 </StackPanel> 9

<Language.xaml.cs>

C#

1 2 private void RadioButtonENG_Checked(object sender, RoutedEventArgs e) 3 { 4 ApplicationSetting.NowLanguage = "en-US"; 5 } 6 7 private void RadioButtonJPA_Checked(object sender, RoutedEventArgs e) 8 { 9 ApplicationSetting.NowLanguage = "ja-JP"; 10 } 11 12 private void OK_Click(object sender, RoutedEventArgs e) 13 { 14 SetLanguage(ApplicationSetting.NowLanguage); 15 } 16 17 private void SetLanguage(string cultureCode) 18 { 19 var dictionary = new ResourceDictionary(); 20 dictionary.Source = new Uri(@"/AppResources;component/Resources/Language/StringResource." + cultureCode + @".xaml", UriKind.Relative); 21 this.Resources.MergedDictionaries.Add(dictionary);//←この部分 22 }
TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アプリケーション全体で切り替えてよければ、
this.Resources.MergedDictionaries.Add(dictionary);//←この部分
Application.Current.Resources.MergedDictionaries.Add(dictionary);
するのが簡単でしょうか。


追記
メインウィンドウと言語設定ダイアログがあると思い、こんな感じになりましたがどうでしょうか。

xml:MainWindow.xaml

1<Window 2 x:Class="Questions._224205.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Title="MainWindow" 6 Width="800" 7 Height="450"> 8 <StackPanel> 9 <Label Content="{DynamicResource language}" /> 10 <Button Click="Button_Click" Content="{DynamicResource setting}" /> 11 </StackPanel> 12</Window>

cs:MainWindow.xaml.cs

1using System; 2using System.Windows; 3 4namespace Questions._224205 5{ 6 public partial class MainWindow : Window 7 { 8 // 何か設定ファイルから読んだとして 9 internal static string NowLanguage = "ja-JP"; 10 public MainWindow() 11 { 12 InitializeComponent(); 13 SetLanguage(NowLanguage); 14 } 15 private void Button_Click(object sender, RoutedEventArgs e) 16 => new Language().ShowDialog(); 17 18 public static void SetLanguage(string cultureCode) 19 { 20 var dictionary = new ResourceDictionary 21 { 22 Source = new Uri(@"Resources/Language/StringResource." + cultureCode + @".xaml", UriKind.Relative) 23 }; 24 Application.Current.Resources.MergedDictionaries.Clear(); 25 Application.Current.Resources.MergedDictionaries.Add(dictionary); 26 } 27 } 28}

xml:Language.xaml

1<Window 2 x:Class="Questions._224205.Language" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Title="{DynamicResource setting}" 6 Width="800" 7 Height="450" 8 WindowStartupLocation="CenterScreen"> 9 <StackPanel> 10 <TextBlock x:Name="TestTextBox" Text="{DynamicResource language}" /> 11 <RadioButton 12 x:Name="radioButton_ENG" 13 VerticalContentAlignment="Center" 14 Checked="RadioButtonENG_Checked" 15 Content="English" /> 16 <RadioButton 17 x:Name="radioButton_JPA" 18 VerticalContentAlignment="Center" 19 Checked="RadioButtonJPA_Checked" 20 Content="日本語" /> 21 </StackPanel> 22</Window>

cs:Language.xaml.cs

1using System.Windows; 2 3namespace Questions._224205 4{ 5 public partial class Language : Window 6 { 7 public Language() 8 { 9 InitializeComponent(); 10 11 // 雑すぎますが本題ではないので。。 12 switch(MainWindow.NowLanguage) 13 { 14 case "en-US": 15 radioButton_ENG.IsChecked = true; 16 break; 17 case "ja-JP": 18 radioButton_JPA.IsChecked = true; 19 break; 20 } 21 } 22 23 private void RadioButtonENG_Checked(object sender, RoutedEventArgs e) 24 // 雑すぎますが本題ではないので。。 25 => MainWindow.SetLanguage("en-US"); 26 27 private void RadioButtonJPA_Checked(object sender, RoutedEventArgs e) 28 => MainWindow.SetLanguage("ja-JP"); 29 } 30}

xml:StringResource.en

1<ResourceDictionary 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:system="clr-namespace:System;assembly=mscorlib"> 5 <system:String x:Key="language">Language</system:String> 6 <system:String x:Key="setting">setting</system:String> 7</ResourceDictionary>

xml:StringResource.ja

1<ResourceDictionary 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:system="clr-namespace:System;assembly=mscorlib"> 5 <system:String x:Key="language">言語</system:String> 6 <system:String x:Key="setting">設定</system:String> 7</ResourceDictionary>

イメージ説明


追記 画像の場合

xml:StringResource.ja

1<ResourceDictionary 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:system="clr-namespace:System;assembly=mscorlib"> 5 <BitmapImage x:Key="ButtonImage" UriSource="/Questions.224205;component/Resources/Image/ButtonImage_jpa.png" /> 6</ResourceDictionary>

Questions.224205の部分はアセンブリ名(マウスで簡単に指定できます)
イメージ説明

xml:MainWindow.xaml

1<Window 2 x:Class="Questions._224205.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Title="MainWindow" 6 Width="800" 7 Height="450"> 8 <StackPanel> 9 <Image Source="{DynamicResource ButtonImage}" /> 10 </StackPanel> 11</Window>

投稿2019/11/19 11:55

編集2023/07/17 04:34
TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tride

2019/11/19 12:42

試してみた所、コンパイルは通りましたが、MainWindowのTextBlock に変化はありませんでした。
TN8001

2019/11/19 14:15

コードを追記しました。 状況に誤認があればお知らせください。
tride

2019/11/19 14:25

回答ありがとうございます。 先ほど頂いた回答で、 Application.Current.MainWindow.Resources.MergedDictionaries.Add(dictionary); とすると目的は実現できました。 また、追記頂いた内容はとても参考になりました。 改めて、お礼致します。 お次はこのコードで画像の切り替えに挑もうと思います。
tride

2019/11/20 02:17

すいません。ベストアンサーを選んでからで申し訳ないんですが、教えていただいたソースで分からなくなったので書き込みます。 教えていただいたソースに以下のような画像のuriと画像ファイルがあったとして、これをxaml上でバインドさせて切り替えようとする場合はどのようにすれば実現できるでしょうか。 <StringResource.ja-jp.xaml> <system:String x:Key="ButtonImage">/Resources/Image/ButtonImage_jpa.png</system:String> <StringResource.en-us.xaml> <system:String x:Key="ButtonImage">/Resources/Image/ButtonImage_Eng.png</system:String>
TN8001

2019/11/20 02:56

追記しました。 system:Stringでも可能かと思いますが、すぐにはわからなかったためBitmapImageにさせて頂きました。
tride

2019/11/20 03:30

できました!ありがとうございます! マウスでの指定方法やBitmapImageでの指定方法は知りませんでしたのでとても助かりました。
TN8001

2019/11/20 04:45

すいません。 Application.Current.Resources.MergedDictionaries.Add(dictionary); の前に Application.Current.Resources.MergedDictionaries.Clear(); を入れるべきでした。 画像が多かった場合、どんどん大きくなってしまいますね。
tride

2019/11/20 08:02

おぉ、危ないところでした。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問