Как получить строку из ресурса для назначения в разделе ресурсов 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, который встраивается как ресурс в приложение Как достичь этого?

Ответ 1

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

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

Ответ 2

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

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

Мне также пришлось включить пространство имен .Properties в моем xaml, например:

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

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

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

Бен

Ответ 3

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

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

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

Ответ 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

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

Ответ 6

Я не знаю, можно ли это сделать непосредственно в 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>