Как получить строку из ресурса для назначения в разделе ресурсов WPF в xaml

У меня есть приложение 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>
    ...

теперь я хочу получить строку "xxUser" из файла resx, который встроен в качестве ресурса в приложение Как мне этого достичь?

6 ответов


ни один из этих ответов близка к тому, что вы хотите. Я бы начал с чтения о локализации в WPF. Вы обнаружите, что если вы делаете локализацию с WPF, вам понадобится X:Uid, определенный на каждом узле вашего приложения.

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


я смог сделать это в программе с:

<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, например:

xmlns:prop="clr-namespace:MyProjectNamespace.Properties"

Это позволило мне не только использовать строковые ресурсы, которые я определил для своего проекта для глобализации, но я также смог привязать (двухсторонний) к настройкам моего приложения. Это позвольте мне очень легко запомнить позицию окна, размер и т. д. Как видите, используйте настройки. для настроек и ресурсов. для ресурсы.

Как упоминал Стивен, я думаю, что "официальный" способ или "лучший" способ-придерживаться x:Uid на всем, что вы хотите глобализовать, но я этого не сделал, и это сработало без проблем. Я думаю, что вещь x:Uid в основном требуется, если вы используете автоматические инструменты или разбиваете задачу перевода, как в большом проекте. Я просто сделал все свои собственные вещи вручную в VS, так что, возможно, все было в порядке.

Бен


еще два дополнительных момента, которые я забыл упомянуть выше в "я смог это сделать...":

  1. вам не нужно обертывать свойства.Ресурсы объекта в вашем собственном. Вы можете получить к нему прямой доступ, как я сделал в моем примере выше. Я думаю, что обертывание объекта-это способ получить тот же результат, что и в моем 2-м пункте.
  2. по умолчанию файлы ресурсов создаются с помощью "ResXFileCodeGenerator". Это делает их внутренними при создании файла кода, поэтому xaml не могу получить доступ. Вы должны изменить это "PublicResXFileCodeGenerator", который генерирует открытые классы. Это можно изменить, щелкнув файл ресурсов в обозревателе решений и изменив свойство "пользовательский инструмент".

(извините, я не мог редактировать свой пост выше, потому что я был временным членом в то время.)


создать статический класс, который делает ресурсы доступными как свойства:

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

As Бен сказал, и я нашел еще один учебник. The access modifier of Resources.resx должно быть изменено с Internal to Public. Я много раз терпел неудачу и после изменения access modifier до Public, он работает.


Я не знаю, можно ли это сделать непосредственно в XAML, но если вы напишете свой собственный класс-оболочку вокруг ResourceManager и используете его вместо этого. Обратите внимание, что класс наследует TextBlock:

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

затем вы можете использовать ResourceContentTextBlock в XAML в любом месте, где в противном случае вы бы использовали 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>