Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从xaml的WPF资源部分中分配的资源中获取字符串_C#_Wpf_Localization_Xbap - Fatal编程技术网

C# 如何从xaml的WPF资源部分中分配的资源中获取字符串

C# 如何从xaml的WPF资源部分中分配的资源中获取字符串,c#,wpf,localization,xbap,C#,Wpf,Localization,Xbap,我有一个具有以下用户控件的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">

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

我不知道是否可以直接在XAML中实现,但是否可以围绕ResourceManager编写自己的包装器类并使用它。请注意,该类继承自TextBlock:

public class ResourceContentTextBlock : TextBlock
{
    public string ResourceName 
    {
        set
        {
            this.Text = Properties.Resources.ResourceManager.GetString(value);
        }
    }
}
<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>
然后,您可以在XAML中的任何地方使用ResourceContentTextBlock,否则您将使用TextBlock:

public class ResourceContentTextBlock : TextBlock
{
    public string ResourceName 
    {
        set
        {
            this.Text = Properties.Resources.ResourceManager.GetString(value);
        }
    }
}
<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>

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

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

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


我可以通过以下方式在程序中完成:

<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>
这使我不仅可以使用为全球化项目定义的字符串资源,而且还可以(双向)绑定到应用程序的设置。这让我很容易记住窗口的位置、大小等。如您所见,请使用设置。用于设置和资源。资源

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


Ben

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

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

    如前所述,我发现。
    Resources.resx的
    访问修饰符
    应该从
    内部
    更改为
    公共
    。我失败了很多次,在将
    访问修饰符
    更改为
    公共
    后,它确实起了作用。

    非常感谢您提供了这一有用且信息丰富的答案。这对我帮助很大——这是我项目中最后一个缺失的部分:-)我只是混淆了资源——它们必须通过项目的属性来定义,而不是通过“添加->新项目->资源”,对吗?我很高兴它帮助了原创海报,但通常论坛的目的是在官方文档中添加一些内容。就我的2美分。广告2。这是常见的省略(令人惊讶),VS允许您简单地切换到“公共”(“工具栏中的访问修饰符”组合)。不需要第三方工具。感谢这条提示,我试图弄明白为什么我的资源都设置为内部,无法使用。。。为什么这不是Visual Studio中的下拉字段\我对此感到困惑。这是怎么回事?为什么定义了一个setter而没有getter?C#和XAML中的文本“String1”有任何联系吗?请澄清。你是对的——我必须承认这是一个糟糕的答案,有几个错误。我做了一些机会来纠正它,但这是一个麻烦的解决办法。其思想是在XAML中将ResourceName属性设置为“String1”。ResourceContentTextBlock使用此值从资源中获取本地化字符串,并更新继承的文本框的文本属性。这就是为什么不需要get属性。