本主题介绍开发人员有关如何使用可本地化用户界面(UI)编写 Windows Presentation Foundation(WPF)应用程序的指南。 过去,UI 的本地化过程非常耗时。 每种语言在 UI 适配时都需要按每个像素进行调整。 现在,可以使用正确的设计和正确的编码标准来构造 UI,以便本地化人员进行更少的调整大小和重新定位。 编写可更轻松地调整大小和重新定位的应用程序的方法称为自动布局,可以使用 WPF 应用程序设计来实现。
使用自动布局的优点
由于 WPF 演示系统功能强大且灵活,因此,它可以在应用程序中布局元素,以便根据不同语言的要求进行调整。 以下列表指出了自动布局的一些优势。
UI 在所有语言中均显示良好。
减少在翻译文本后重新调整控件的位置和大小的需求。
减少调整窗口大小的需求。
UI 布局能在任何语言中正确显示。
本地化可能被降低至仅仅是字符串翻译。
自动布局和控件
自动布局使应用程序能够自动调整控件的大小。 例如,控件可以更改以适应字符串的长度。 此功能使本地化人员能够转换字符串;它们不再需要调整控件的大小以适应翻译的文本。 以下示例创建一个包含英语内容的按钮。
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ButtonLoc.Pane1"
Name="myWindow"
SizeToContent="WidthAndHeight"
>
<DockPanel>
<Button FontSize="28" Height="50">My name is Hope.</Button>
</DockPanel>
</Window>
在此示例中,创建西班牙语按钮所要做的就是更改文本。 例如,
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="ButtonLoc.Pane1"
Name="myWindow"
SizeToContent="WidthAndHeight"
>
<DockPanel>
<Button FontSize="28" Height="50">Me llamo Esperanza.</Button>
</DockPanel>
</Window>
下图显示了代码示例的输出:
自动布局和编码标准
使用自动布局方法需要一组编码和设计标准和规则来生成完全可本地化的 UI。 以下指南将帮助你进行自动布局编码。
请勿使用绝对位置
请勿使用 Canvas ,因为它绝对定位元素。
使用DockPanel、StackPanel和Grid来定位控件。
有关各种类型的面板的讨论,请参阅 面板概述。
不要为窗口设置固定大小
使用 Window.SizeToContent。 例如:
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="GridLoc.Pane1" >
将 a FlowDirection 添加到应用程序的根元素。
WPF 提供了一种支持水平布局、双向布局和垂直布局的便捷方法。 在演示文稿框架中, FlowDirection 该属性可用于定义布局。 流方向模式为:
FlowDirection.LeftToRight (LrTb) - 拉丁语、东亚等的水平布局。
FlowDirection.RightToLeft (RlTb)— 用于阿拉伯语、希伯来语等语言的双向支持。
使用复合字体而不是物理字体
使用复合字体时, FontFamily 无需本地化该属性。
开发人员可以使用以下字体之一或创建自己的字体。
- 全局用户界面
- 全球圣塞里夫
- Global Serif
添加 xml:lang
在 UI 的根元素中添加
xml:lang
属性,例如在英语应用程序中使用xml:lang="en-US"
。由于复合字体用于
xml:lang
确定要使用的字体,因此请将此属性设置为支持多语言方案。
自动布局和网格
该 Grid 元素对于自动布局非常有用,因为它使开发人员能够定位元素。 控件 Grid 能够使用列和行排列在其子元素之间分配可用空间。 UI 元素可以跨越多个单元格,并且可以在网格内嵌套其他网格。 网格非常有用,因为它们使你能够创建和定位复杂的 UI。 以下示例演示如何使用网格定位某些按钮和文本。 请注意,单元格的高度和宽度设置为 Auto;因此,包含具有图像的按钮的单元格将调整以适应图像。
<Grid Name="grid" ShowGridLines ="false">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Margin="10, 10, 5, 5" Grid.Column="0" Grid.Row="0" FontSize="24">Grid
</TextBlock>
<TextBlock Margin="10, 10, 5, 5" Grid.Column="0" Grid.Row="1" FontSize="12"
Grid.ColumnSpan="2">The following buttons and text are positioned using a Grid.
</TextBlock>
<Button Margin="10, 10, 5, 5" Grid.Column="0" Grid.Row="2" Background="Pink"
BorderBrush="Black" BorderThickness="10">Button 1
</Button>
<TextBlock Margin="10, 10, 5, 5" Grid.Column="1" Grid.Row="2" FontSize="12"
VerticalAlignment="Center" TextWrapping="WrapWithOverflow">Sets the background
color.
</TextBlock>
<Button Margin="10, 10, 5, 5" Grid.Column="0" Grid.Row="3" Foreground="Red">
Button 2
</Button>
<TextBlock Margin="10, 10, 5, 5" Grid.Column="1" Grid.Row="3" FontSize="12"
VerticalAlignment="Center" TextWrapping="WrapWithOverflow">Sets the foreground
color.
</TextBlock>
<Button Margin="10, 10, 5, 5" Grid.Column="0" Grid.Row="4">
<Image Source="data\flower.jpg"></Image>
</Button>
<TextBlock Margin="10, 10, 5, 5" Grid.Column="1" Grid.Row="4" FontSize="12"
VerticalAlignment="Center" TextWrapping="WrapWithOverflow">Adds an image as
the button's content.
</TextBlock>
</Grid>
下图显示了上一个代码生成的网格。
网 格
使用 IsSharedSizeScope 属性的自动布局和网格
元素 Grid 在可本地化应用程序中很有用,用于创建调整以适应内容的控件。 但是,有时你希望控件保持特定大小,而不考虑内容。 例如,如果你有“确定”、“取消”和“浏览”按钮,你可能不希望调整这些按钮的大小以适应内容。 在这种情况下,Grid.IsSharedSizeScope 附属属性对于在多个网格元素之间共享相同的尺寸是很有用的。 以下示例演示如何在多个 Grid 元素之间共享列和行大小调整数据。
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
<Button Click="setTrue" Margin="0,0,10,10">Set IsSharedSizeScope="True"</Button>
<Button Click="setFalse" Margin="0,0,10,10">Set IsSharedSizeScope="False"</Button>
</StackPanel>
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
<Grid ShowGridLines="True" Margin="0,0,10,0">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="FirstColumn"/>
<ColumnDefinition SharedSizeGroup="SecondColumn"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" SharedSizeGroup="FirstRow"/>
</Grid.RowDefinitions>
<Rectangle Fill="Silver" Grid.Column="0" Grid.Row="0" Width="200" Height="100"/>
<Rectangle Fill="Blue" Grid.Column="1" Grid.Row="0" Width="150" Height="100"/>
<TextBlock Grid.Column="0" Grid.Row="0" FontWeight="Bold">First Column</TextBlock>
<TextBlock Grid.Column="1" Grid.Row="0" FontWeight="Bold">Second Column</TextBlock>
</Grid>
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="FirstColumn"/>
<ColumnDefinition SharedSizeGroup="SecondColumn"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" SharedSizeGroup="FirstRow"/>
</Grid.RowDefinitions>
<Rectangle Fill="Silver" Grid.Column="0" Grid.Row="0"/>
<Rectangle Fill="Blue" Grid.Column="1" Grid.Row="0"/>
<TextBlock Grid.Column="0" Grid.Row="0" FontWeight="Bold">First Column</TextBlock>
<TextBlock Grid.Column="1" Grid.Row="0" FontWeight="Bold">Second Column</TextBlock>
</Grid>
</StackPanel>
<TextBlock Margin="10" DockPanel.Dock="Top" Name="txt1"/>
注释
有关完整的代码示例,请参阅 “在网格之间共享大小调整属性”。