Windows通用右到左支持

时间:2016-04-12 15:42:41

标签: win-universal-app right-to-left

有必要支持从右到左的样式(文本和布局)。我了解当您在其继承的所有子控件中设置父Grid的属性FlowDirection = "RightToLeft"时。 问题是 - 是否有任何默认设置,这将改变我们在应用程序中所需的一切?或者,如果我们(例如在阿拉伯国家/地区),我应该如何设置每个家长贪婪FlowDirection并将此旗帜设为FlowDirection = "RightToLeft"

1 个答案:

答案 0 :(得分:1)

如果你要支持任何左翼语言,那么也需要有一个从右到左的布局。您不需要更改所有元素的FlowDirection属性,因为它是由子元素继承的。

MSDN

  

对象从其父级继承FlowDirection值   对象树。任何元素都可以覆盖它从中获取的值   家长。如果未指定,则默认FlowDirection为LeftToRight

所以通常你需要为Window的根元素/框架设置一次属性。

但是,某些元素(如FontIconImage)不会自动镜像。 FontIcon有一个MirroredWhenRightToLeft属性:

  

您可以将MirroredWhenRightToLeft属性设置为具有字形   当FlowDirection为RightToLeft时显示为镜像。你通常   使用FontIcon将图标显示为零件时使用此属性   控件模板和图标需要与镜像一起镜像   其余的控制

对于图像,您需要通过变换翻转图像。

修改

您可以在Application类中设置创建主框架/页面的属性:

// Part of the App.xaml.cs in default UWP project template:

protected override void OnLaunched(LaunchActivatedEventArgs e) {

#if DEBUG
if (System.Diagnostics.Debugger.IsAttached) {
   this.DebugSettings.EnableFrameRateCounter = true;
}
#endif

Frame rootFrame = Window.Current.Content as Frame;

// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == null) {
// Create a Frame to act as the navigation context and navigate to the first page
   rootFrame = new Frame();

   rootFrame.NavigationFailed += OnNavigationFailed;

   if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) {
       //TODO: Load state from previously suspended application
   }

   //**********************
   // Set flow direction
   // *********************
   if (System.Globalization.CultureInfo.CurrentCulture.TextInfo.IsRightToLeft) {
      rootFrame.FlowDirection = FlowDirection.RightToLeft;
   }

   // Place the frame in the current Window
   Window.Current.Content = rootFrame;

   }
   ...
   ...

如果你不想使用后面的代码(我认为可以在这种情况下使用它),你可以实现IValueConverter(不推荐):

public class RightToLeftConverter : IValueConverter {
    public object Convert(object value, Type targetType, 
        object parameter, string language)  {
                    if (System.Globalization.CultureInfo.CurrentCulture.TextInfo.IsRightToLeft) {
           return FlowDirection.RightToLeft;
        }
        return FlowDirection.LeftToRight;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

并在XAML中使用它:

<Page
    ...
    ...
    FlowDirection="{Binding Converter={StaticResource RightToLeftConverter}}">