在文本块中我想要一个文本,具体取决于布尔属性的值。 由于应用程序支持多种语言,因此必须使用DynamicResource来获取文本。
DynamicResources中有两个条目,一个用于属性为true,另一个用于属性为false时。
我想在xaml中解决这个问题,以便显示正确的DynamicResource,具体取决于属性的值。
任何人都有想法或者这可能吗? (如何 ;-) ? 感谢。
答案 0 :(得分:0)
以下是您的问题的解决方案。
<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>
<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)); } } } }
更好的选择是创建两个具有相同键但具有不同值的语言文件,并在运行时合并适当的文件。在这种情况下,您不必每次都检查布尔属性!