我有一个带有以下用户控件的XBAP应用程序:
<UserControl x:Class="XXX.UsersGrid"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="Auto" Width="Auto">
<UserControl.Resources>
<DataTemplate x:Key="UpArrowUsers">
<DockPanel>
<TextBlock Text="xxUser" x:Name="upArrowUsersHeader" HorizontalAlignment="Center"></TextBlock>
<Path x:Name="arrow" StrokeThickness = "1" Fill= "gray" Data= "M 5,10 L 15,10 L 10,5 L 5,10"/>
</DockPanel>
</DataTemplate>
</UserControl>
...
现在我想从resx文件中获取字符串“xxUser”,该文件作为资源嵌入到应用程序中 我如何实现这一目标?
答案 0 :(得分:43)
我能够在以下程序中完成:
<TextBlock VerticalAlignment="Center" Margin="3"
Text="{x:Static prop:Resources.OpenButton}"
Visibility="{Binding Source={x:Static prop:Settings.Default}, Path=ShowButtonText, Converter={StaticResource BoolToVis}}"></TextBlock>
我还必须在我的xaml中包含.Properties命名空间,如下所示:
xmlns:prop="clr-namespace:MyProjectNamespace.Properties"
这使我不仅可以使用我为我的项目为全球化定义的字符串资源,而且还能够(双向)绑定到我的应用程序的设置。这让我很容易记住窗口的位置,大小等。正如您所看到的,使用“设置”。用于设置和资源。对于资源。
正如史蒂文所说,我认为“官方”方式或“最佳”方式是将x:Uid粘贴在你想要全球化的所有东西上,但我没有,它没有任何问题。我认为如果您使用自动化工具或像在大型项目中那样打破翻译任务,则大多数情况下都需要x:Uid。我只是在VS中手动完成了所有我自己的东西,所以也许没问题。
本
答案 1 :(得分:9)
我在上面忘记提到的另外两点“我能够做到......”:
(对不起,我无法编辑上面的帖子,因为那时我是临时会员。)
答案 2 :(得分:5)
创建一个静态类,使资源可用作属性:
public static class Resources
{
public string Resource
{
return Properties.Resources.ResourceManager.GetString("Resource");
}
}
然后您可以将TextBox绑定到此:
<TextBlock Text="{Binding Source={x:Static local:Resources}, Path=Resource}" x:Name="upArrowUsersHeader" HorizontalAlignment="Center"
xmlns:local="clr-namespace:MY_NAMESPACE;assembly=MY_ASSEMBLY">
答案 3 :(得分:5)
正如Ben所说,我找到an another tutorial。
access modifier
的{{1}}应从Resources.resx
更改为Internal
。我失败了很多次,在将Public
更改为access modifier
之后,它确实有效。
答案 4 :(得分:3)
这些答案都不是你想要的。我首先阅读WPF中的本地化。您会发现,如果您使用WPF进行本地化,则需要在应用程序的每个节点上定义x:Uid。
答案 5 :(得分:0)
我不知道这是否可以直接在XAML中完成,但如果您在ResourceManager周围编写自己的包装类并使用它。请注意,该类继承自TextBlock:
public class ResourceContentTextBlock : TextBlock
{
public string ResourceName
{
set
{
this.Text = Properties.Resources.ResourceManager.GetString(value);
}
}
}
然后,您可以在XAML中的任何位置使用ResourceContentTextBlock,否则您将使用TextBlock:
<Window x:Class="WpfApplication3.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:client="clr-namespace:WpfApplication3"
>
<client:ResourceContentTextBlock ResourceName="String1" />
</Window>