【问题标题】:How to fetch string from resource to assign in WPF Resource section in xaml如何从资源中获取字符串以在 xaml 的 WPF 资源部分中分配
【发布时间】:2010-10-14 12:36:44
【问题描述】:

我有一个具有以下用户控件的 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” 我如何做到这一点?

【问题讨论】:

    标签: c# wpf localization xbap


    【解决方案1】:

    我能够在一个程序中做到这一点:

    <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"
    

    这让我不仅可以使用我为我的项目定义的字符串资源进行全球化,而且我还能够(两种方式)绑定到我的应用程序的设置。这让我非常容易记住窗口的位置、大小等。如您所见,使用设置。用于设置和资源。资源。

    正如 Steven 所提到的,我认为“官方”方式或“最佳”方式是将 x:Uid 粘贴到您想要全球化的所有内容上,但我没有这样做,而且它没有任何问题。我认为如果您使用自动化工具或像在大型项目中那样分解翻译任务,则最需要 x:Uid 东西。我只是在 VS 中手动完成了我自己的所有工作,所以也许没问题。

    【讨论】:

    • 非常感谢您提供这个有用且内容丰富的答案。它对我帮助很大——它是我项目中最后一个缺失的部分 :-) 我只是对资源感到困惑——它们必须通过项目的属性来定义,而不是通过“添加 -> 新项目 -> 资源”,对吗?
    【解决方案2】:

    另外两点我忘了在上面的“我能做到...”中提到:

    1. 您不必将 Properties.Resources 对象包装在您自己的文件中。您可以直接访问它,就像我在上面的示例中所做的那样。我认为包装对象是一种获得与我在第二点中讨论的相同结果的方法。
    2. 默认情况下,资源文件是使用“ResXFileCodeGenerator”构建的。这使得它们在生成代码文件时成为内部文件,因此 xaml 无法访问它。您必须将其更改为“PublicResXFileCodeGenerator”,它会生成公共类。您可以通过单击解决方案资源管理器中的资源文件并编辑“自定义工具”属性来更改此设置。

    (抱歉,由于当时我是临时会员,无法编辑以上帖子。)

    【讨论】:

    • ad.2.这是常见的遗漏(惊喜),VS 允许您简单地切换到“公共”(工具栏中的“访问修饰符”组合)。不需要第三方工具。
    • 感谢您的提示,我试图弄清楚为什么我的资源都设置为内部并且无法使用...为什么这不是 Visual Studio 中的下拉字段? :\
    【解决方案3】:

    正如Ben 所说,我找到了an another tutorialResources.resxaccess modifier 应从 Internal 更改为 Public。我失败了很多次,在将access modifier 更改为Public 后,它确实有效。

    【讨论】:

      【解决方案4】:

      创建一个静态类,使资源作为属性可用:

      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">
      

      【讨论】:

        【解决方案5】:

        这些答案都不是你想要的。我将从阅读 WPF 中的本地化开始。您会发现,如果您使用 WPF 进行本地化,您需要在应用程序的每个节点上定义 x:Uid。

        http://msdn.microsoft.com/en-us/library/ms788718.aspx

        【讨论】:

        • 我很高兴它帮助了原始发布者,但通常论坛的目的是在官方文档中添加一些东西。只是我的 2 美分。
        【解决方案6】:

        我不知道这是否可以直接在 XAML 中完成,但如果您围绕 ResourceManager 编写自己的包装类并改用它。请注意,该类继承自 TextBlock:

        public class ResourceContentTextBlock : TextBlock
        {
            public string ResourceName 
            {
                set
                {
                    this.Text = Properties.Resources.ResourceManager.GetString(value);
                }
            }
        }
        

        然后,您可以在 XAML 中使用 TextBlock 的任何地方使用 ResourceContentTextBlock:

        <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>
        

        【讨论】:

        • 我对此感到困惑。这里发生了什么?为什么你定义了一个setter,但没有定义getter? C# 和 XAML 中的文字“String1”有什么联系吗?请澄清。
        • 你是对的 - 我必须承认这是一个糟糕的答案,有几个错误。我做了一些纠正它的机会,但这是一个麻烦的解决方案。这个想法是 ResourceName 属性在 XAML 中设置为“String1”。 ResourceContentTextBlock 使用此值从资源中获取本地化字符串并更新继承的 TextBox 的 Text 属性。这就是为什么不需要 get 属性的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        相关资源
        最近更新 更多