2012-05-24 2 views
1

в текстовом блоке я хотел бы получить текст в зависимости от значения логического свойства. текст должен быть использован с использованием DynamicResource из-за множества языков, поддерживаемых приложением.показать другой динамический ресурс в зависимости от значения свойства

Есть две записи, доступные в DynamicResources, одна для тех случаев, когда свойство является истинным, для тех, когда свойство является ложным.

Я хотел бы решить это в xaml, так что будет показан правильный DynamicResource в зависимости от значения свойства.

Кто-нибудь может это сделать или это возможно? (и как ;-) ? спасибо.

ответ

0

Ниже приведено решение проблемы.

  • ResourceDictionary
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:system="clr-namespace:System;assembly=mscorlib" 
        > 
    <system:String x:Key="Lang1">Lang1 Message</system:String> 
    <system:String x:Key="Lang2">Lang2 Message</system:String> 
</ResourceDictionary> 
  • App.xaml
<Application x:Class="MultiLang.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="LangResources.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 
  • MainWindow.xaml

    <Window.Resources> 
        <vm:MainWindowViewModel x:Key="mainVM" /> 
    </Window.Resources> 
    
    <Grid DataContext="{StaticResource mainVM}"> 
    
        <ToggleButton Name="btnLang" IsChecked="{Binding Var}" Content="Change lang" MaxWidth="100" MaxHeight="30"> 
    
        </ToggleButton> 
    
        <TextBlock Margin="5" MaxHeight="30" VerticalAlignment="Top"> 
         <TextBlock.Style> 
          <Style TargetType="{x:Type TextBlock}"> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding Path=DataContext.Var, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}}" Value="True"> 
             <Setter Property="Text" Value="{DynamicResource Lang1}" /> 
            </DataTrigger> 
            <DataTrigger Binding="{Binding Path=DataContext.Var, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Grid}}" Value="False"> 
             <Setter Property="Text" Value="{DynamicResource Lang2}" /> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </TextBlock.Style> 
        </TextBlock> 
    </Grid> 
    

  • MainWindowViewModel

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel; 

namespace MultiLang 
{ 
    public class MainWindowViewModel: INotifyPropertyChanged 
    { 
     private bool _var = false; 
     public bool Var 
     { 
      get { return _var; } 
      set 
      { 
       _var = value; 
       OnPropertyChanged("Var"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void OnPropertyChanged(string name) 
     {   
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 

       handler(this, new PropertyChangedEventArgs(name)); 
      } 
     } 
    } 
} 

Лучшая опция - создать два языковых файла с одинаковыми ключами, но с разными значениями и объединить правильные файлы во время выполнения. В этом случае вам не нужно каждый раз проверять свойство boolean!

+0

благодарит за ваш ответ. оно работает. –

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