Ответ 1
Ни один из этих ответов не близок к тому, что вы хотите. Я бы начал с чтения о локализации в WPF. Вы обнаружите, что если вы выполняете локализацию с помощью WPF, вам понадобится x: Uid, определенная на каждом node в вашем приложении.
У меня есть приложение 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, который встраивается как ресурс в приложение Как достичь этого?
Ни один из этих ответов не близок к тому, что вы хотите. Я бы начал с чтения о локализации в WPF. Вы обнаружите, что если вы выполняете локализацию с помощью WPF, вам понадобится x: Uid, определенная на каждом node в вашем приложении.
Я смог сделать это в программе:
<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, поэтому, возможно, все в порядке.
Бен
Еще два дополнительных момента, о которых я забыл упомянуть выше в "Я смог это сделать...":
(извините, я не смог отредактировать мой пост выше, потому что я был временным членом в то время.)
Создайте статический класс, который сделает ресурсы доступными как свойства:
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">
Как Ben сказал, и я нашел еще один учебник.
access modifier
of Resources.resx
следует изменить с Internal
на 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>