2013-03-02 2 views
1
<Application 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="MultiLanguage.App" 
StartupUri="MainWindow.xaml"> 
<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary x:Name="LanguageDictionary" Source="/LanguageResources;component/EnglishResources.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Как динамически добавлять ключ и значение в ResourceDictionary в wpf?

EnglishResources.xaml

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:sys="clr-namespace:System;assembly=mscorlib"> 

<sys:String x:Key="add">ADD</sys:String> 
<sys:String x:Key="key">Key</sys:String> 
<sys:String x:Key="stringValue">String Value</sys:String> 

MainWindow.xaml

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="MultiLanguage.MainWindow" 
x:Name="Window" 
Title="MainWindow" 
Width="640" Height="480"> 

<Grid x:Name="LayoutRoot" HorizontalAlignment="Center" VerticalAlignment="Center"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <Button x:Name="btnAdd" Content="{DynamicResource add}" Height="48" Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2" Margin="10" Click="btnAdd_Click" /> 
    <TextBlock Text="{DynamicResource key}" Height="40" Width="100" Grid.Column="0" Grid.Row="0" Margin="10"/> 
    <TextBlock Text="{DynamicResource stringValue}" Height="40" Width="100" Grid.Column="0" Grid.Row="1" Margin="10"/> 
    <TextBox x:Name="txtKey" Height="40" Width="200" Grid.Column="1" Grid.Row="0" Margin="10"/> 
    <TextBox x:Name="txtStringValue" Height="40" Width="200" Grid.Column="1" Grid.Row="1" Margin="10"/> 
</Grid> 

с выше коде, я получаю следующее окно

enter image description here

private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     AddKeyValue(txtKey.Text, txtStringValue.Text); 
    } 


    private void AddKeyValue(object key, object value) 
    { 
     // load the resource dictionary 
     var rd = new System.Windows.ResourceDictionary(); 
     rd.Source = new System.Uri("pack://application:,,,/LanguageResources;component/EnglishResources.xaml", System.UriKind.RelativeOrAbsolute); 

     // add the new key with value 
     rd.Add(key, value); 

     // now you can save the changed resource dictionary 
     var settings = new System.Xml.XmlWriterSettings(); 
     settings.Indent = true; 
     var writer = System.Xml.XmlWriter.Create(@"EnglishResources.xaml", settings); 
     System.Windows.Markup.XamlWriter.Save(rd, writer); 
    } 

Если я нажмите кнопку Добавить значение должно быть вставлено в словаре ресурсов, которые (EnglishResources.xaml) уже у меня есть. Но это не вставка. Пожалуйста, помогите мне.

мне нужно Как

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:sys="clr-namespace:System;assembly=mscorlib"> 

<sys:String x:Key="add">ADD</sys:String> 
<sys:String x:Key="key">Key</sys:String> 
<sys:String x:Key="stringValue">String Value</sys:String> 

<!-- the value should be inserted here. But not Insert--> 

</ResourceDictionary> 

После Добавлено

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib"> 

<s:String x:Key="add">ADD</sys:String> 
<s:String x:Key="key">Key</sys:String> 
<s:String x:Key="stringValue">String Value</sys:String> 

<!-- the value should be inserted here. But not Insert--> 

</ResourceDictionary> 

После того, как я добавил значение в словаре ресурсов я получить результат, как и выше. sys изменен на s и пространство имен объединяется как строка.

ответ

3

вы можете сделать это с помощью этого простого решения

private void AddKeyValue(object key, object value) { 
    // load the resource dictionary 
    var rd = new System.Windows.ResourceDictionary(); 
    rd.Source = new System.Uri("pack://application:,,,/YOURAssemblyName;component/EnglishResources.xaml", System.UriKind.RelativeOrAbsolute); 

    // add the new key with value 
    //rd.Add(key, value); 
    if (rd.Contains(key)) { 
    rd[key] = value; 
    } else { 
    rd.Add(key, value); 
    } 

    // now you can save the changed resource dictionary 
    var settings = new System.Xml.XmlWriterSettings(); 
    settings.Indent = true; 
    var writer = System.Xml.XmlWriter.Create(@"EnglishResources.xaml", settings); 
    System.Windows.Markup.XamlWriter.Save(rd, writer); 
} 

Использование

AddKeyValue("NewKey1", "StringValue"); 
AddKeyValue("NewKey2", 1000); 

Надежда, что помогает.

+0

Если я использую это, это не добавляет ключ и значение в словарь ресурсов. –

+0

@ASHOKA Вы сохранили файл? – punker76

+0

Я пробовал ваш код полностью. это правильно? –

Смежные вопросы