【问题标题】:show another dynamic resource depending on value of property根据属性值显示另一个动态资源
【发布时间】:2012-05-25 05:31:56
【问题描述】:

在文本块中,我想要一个文本,具体取决于布尔属性的值。 由于应用程序支持多种语言,因此必须使用 DynamicResource 获取文本。

DynamicResources 中有两个条目可用,一个用于属性为真时,一个用于属性为假时。

我想在 xaml 中解决这个问题,以便显示正确的 DynamicResource,具体取决于属性的值。

任何人的想法或这是可能的? (如何 ;-) ? 谢谢。

【问题讨论】:

    标签: .net wpf xaml dynamicresource


    【解决方案1】:

    以下是您的问题的解决方案。

    • 资源字典
    <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));
                }
            }
        }
    }
    

    更好的选择是创建两个具有相同键但具有不同值的语言文件,并在运行时合并适当的文件。在这种情况下,您不必每次都检查布尔属性!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      相关资源
      最近更新 更多