2016-04-29 4 views
0

У меня есть две пользовательские кнопки в панели приложений, как показано ниже на прилагаемом скриншоте. Стили для этих кнопок написаны на странице App.xaml. Стили кнопок искажаются при изменении языка приложения/устройства. Сравнивая и анализируя различные сборки я подготовил ранее, я обнаружил, что стили работали отлично, прежде чем я представил ниже изменения переопределения языка культуры в App.xamlWinRT XAML AppBarButton Стиль пользовательского интерфейса в App Culture изменен

CultureInfo ci = new CultureInfo(currentAppLanguage); 
Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = ci.Name; 
CultureInfo.DefaultThreadCurrentCulture = ci; 
CultureInfo.DefaultThreadCurrentUICulture = ci; 

Если значение currentAppLanguage является языком App/Устройство соответственно

Это обновление культуры важно, так как некоторые элементы управления, такие как Datepicker и т. Д., Полагаются на это изменение культуры для перевода на основе выбранного языка.

Ошибочное:

enter image description here

Правильно:

enter image description here

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

Я переопределяю основную языковую культуру, когда приложение загружается на основе выбранного языка. Возможно ли изменение культуры повлиять на стили и элементы XAML?

Любые предложения очень помогут. Спасибо заранее.

Ниже панель управления кнопка приложения и стиль

Кнопка:

<AppBarButton 
     Visibility="{Binding CanReject, Converter={StaticResource BoolToVisibilityConverter}}" 
     x:Name="abReject" 
     Grid.Column="3" 
     Height="62" 
     Width="62" 
     Style="{StaticResource RejectAppBarButtonStyle}" 
     IsEnabled="{Binding LoadedApproval.ApprovalState, Converter={StaticResource StringComparerToBoolConverter}, ConverterParameter=Pending}" 
     BorderBrush="{StaticResource DictationGray}" 
     BorderThickness="2" 
     Foreground="White" 
     Background="{StaticResource ApprovalRejectRed}" 
     Margin="0,0"> 
      <Interactivity:Interaction.Behaviors> 
       <Core:EventTriggerBehavior EventName="Click"> 
        <Core:GoToStateAction StateName="Rejecting" UseTransitions="True"/> 
        </Core:EventTriggerBehavior> 
      </Interactivity:Interaction.Behaviors> 
    </AppBarButton> 

Стиль:

<Style x:Key="RejectAppBarButtonStyle" TargetType="AppBarButton"> 
    <Setter Property="VerticalAlignment" Value="Stretch"/> 
    <Setter Property="HorizontalAlignment" Value="Left"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="AppBarButton" > 
       <Grid x:Name="RootGrid" Background="Transparent"> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="ApplicationViewStates"> 
          <VisualState x:Name="FullSize"/> 
          <VisualState x:Name="Compact"> 
           <Storyboard> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="TextLabel"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/> 
            </ObjectAnimationUsingKeyFrames> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Width" Storyboard.TargetName="RootGrid"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="60"/> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal"/> 
          <VisualState x:Name="PointerOver"> 
           <Storyboard> 
            <RepositionThemeAnimation TargetName="RootGrid"/> 
            <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="PointOverOverlay"/> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Pressed"> 
           <Storyboard> 
            <PointerDownThemeAnimation TargetName="RootGrid"/> 
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Stroke" Storyboard.TargetName="OuterEllipse"> 
             <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApprovalRejectRed}"/> 
            </ObjectAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Disabled"> 
           <Storyboard> 
            <DoubleAnimation Duration="0" To="0.5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="RootGrid"/> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="FocusStates"> 
          <VisualState x:Name="Focused"/> 
          <VisualState x:Name="Unfocused"/> 
          <VisualState x:Name="PointerFocused"/> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <Ellipse 
         x:Name="OuterEllipse" 
         Height="{TemplateBinding Height}" 
         Width="{TemplateBinding Width}" 
         Stroke="{TemplateBinding BorderBrush}" 
         StrokeThickness="2" 
         UseLayoutRounding="True"> 
        </Ellipse> 
        <Grid> 
         <Ellipse 
          x:Name="BackgroundEllipse" 
          Height="{Binding Height, Converter={StaticResource ArithmeticOperationConverter}, ConverterParameter=0.78, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
          Width="{Binding Width, Converter={StaticResource ArithmeticOperationConverter}, ConverterParameter=0.78, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
          Fill="{TemplateBinding Background}" 
          UseLayoutRounding="True"> 
         </Ellipse> 
         <Ellipse 
          x:Name="PointOverOverlay" 
          Opacity="0" 
          Height="{Binding Height, Converter={StaticResource ArithmeticOperationConverter}, ConverterParameter=0.78, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
          Width="{Binding Width, Converter={StaticResource ArithmeticOperationConverter}, ConverterParameter=0.78, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
          Fill="{StaticResource PointOverShade}" 
          UseLayoutRounding="True"> 
         </Ellipse> 
         <Path 
          x:Name="Content" 
          Data="M1.5,1.5 L40.392,40.391 M1.5,40.391 L40.392,1.5" 
          VerticalAlignment="Center" 
          HorizontalAlignment="Center" 
          StrokeStartLineCap="Round" 
          Stretch="Uniform" 
          StrokeEndLineCap="Round" 
          Stroke="{TemplateBinding Foreground}" 
          StrokeThickness="3" 
          StrokeLineJoin="Round" 
          Height="{Binding Height, Converter={StaticResource ArithmeticOperationConverter}, ConverterParameter=0.33, RelativeSource={RelativeSource Mode=TemplatedParent}}" 
          Width="{Binding Width, Converter={StaticResource ArithmeticOperationConverter}, ConverterParameter=0.33, RelativeSource={RelativeSource Mode=TemplatedParent}}"> 
         </Path> 
        </Grid> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Я не совсем уверен, как выглядит ваш стиль? – NotAGenie

+0

Я не думаю, что изменение культуры повлияет на стили XAML и элементы, можете ли вы разместить свой код XAML в стиле этих двух кнопок? Здесь звучит странная проблема. Вы поместили свой стиль в файл ресурсов? –

+0

@ GraceFeng-MSFT. Спасибо за ответ. Я добавил код выше в свой пост. Причина, по которой я указываю на культуру, заключается в том, что версия сборки без этого обновления культуры отлично работает для всех языков. – Sriram

ответ

0

я смог найти, где T он вышел. Это было в преобразователе класса ArithmeticOperationConverter. Ниже приведен метод преобразования.

public object Convert(object value, Type targetType, object parameter, string language) 
{ 
    if (parameter == null) 
     return value; 

    Double val; 
    Double param; 

    if (Double.TryParse(value.ToString(), out val) && Double.TryParse(parameter.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out param)) 
    { 
     switch (Mode) 
     { 
      case (ArithmeticMode.Addition): 
       return val + param; 
      case (ArithmeticMode.Subtratction): 
       return val - param; 
      case (ArithmeticMode.Multiplication): 
       return val * param; 
      case (ArithmeticMode.Division): 
       return val/param; 
      default: 
       return val; 
     } 
    } 
    else 
     return value; 
} 

Здесь метод TryParse(), который анализирует значение параметра в условии, вызвавшем проблему. Значение строки параметра, переданное (например), было «0,78», а результат был равен 78,0 вместо 0,78, что вызвало искажение в пользовательском интерфейсе. Это происходило из-за разницы в культуре между номерами. Я добавил аргумент CultureInfo.InvariantCulture в метод TryParse() и устранил проблему.

Спасибо за ваши предложения @ GraceFeng-MSFT

Смежные вопросы