代码之家  ›  专栏  ›  技术社区  ›  coder_bro

如何在XAML的WPF资源部分中从要分配的资源中提取字符串

  •  10
  • coder_bro  · 技术社区  · 16 年前

    我有一个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”,该文件作为资源嵌入到应用程序中。 我如何做到这一点?

    6 回复  |  直到 12 年前
        1
  •  3
  •   Steven    16 年前

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

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

        2
  •  43
  •   Ben    15 年前

    我可以在一个程序中使用:

    <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里手工做了所有的事情,所以也许没关系。

        3
  •  9
  •   Benny Jobigan    15 年前

    另外两点我在“我能做到……”中忘记提到:

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

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

        4
  •  5
  •   Josh G    16 年前

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

    public static class Resources
    {
       public string Resource
       {
          return Properties.Resources.ResourceManager.GetString("Resource");
       }
    }
    

    然后您可以将文本框绑定到:

    <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
  •  4
  •   Community CDub    8 年前

    AS Ben 说,我发现 an another tutorial . 这个 access modifier 属于 Resources.resx 应该从 Internal Public . 我失败了很多次,在改变了 访问修饰符 公众 它确实有效。

        6
  •  0
  •   Jakob Christensen    14 年前

    我不知道这是否可以在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>
    
    推荐文章