0

我正在尝试在我的 wp8 应用程序中实现本地化。当用户选择其中一个单选按钮时,我有两个单选按钮(阿拉伯语和英语),然后出现弹出窗口,如果他选择确定他想更改应用程序的语言,那么应用程序的语言会改变,但如果他选择取消,那么语言不会发生变化,但问题是即使用户按下取消,单选按钮也会切换。

如何阻止切换发生?

这是我的 Xaml 代码和如果选中任何单选按钮则绑定的代码..

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20">
            <RadioButton  Content="English" Foreground="Black" FontSize="30" IsChecked="{Binding isenglishchecked,Mode=TwoWay, Source={StaticResource appSettings}}" Checked="RadioButton_Checked"/>
            <RadioButton  Content="Arabic" Foreground="Black" FontSize="30" IsChecked="{Binding isarabicchecked,Mode=TwoWay, Source={StaticResource appSettings}}" Checked="RadioButton_Checked"/>
        </StackPanel>
    </Grid>



 public bool isenglishchecked
        {
            get
            {
                return GetValueOrDefault<bool>(isenglishcheckedname, isenglishcheckedDefault);
            }
            set
            {
                var result = MessageBox.Show("This Will Change the Language of the App Do you Want to continue ?", "Language Change", MessageBoxButton.OKCancel);

                if (result == MessageBoxResult.OK)
                {
                    if (AddOrUpdateValue(isenglishcheckedname, value))
                    {
                        Save();
                        if (isenglishchecked)
                        {
                            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
                            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

                            MainViewModel.stationnamelist = null;
                            Messenger.Default.Send<string>("mainpage", "tomainpage");
                            (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
                        }

                        else
                        {
                            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("ar-AE");
                            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ar-AE");

                            MainViewModel.stationnamelist = null;
                            Messenger.Default.Send<string>("mainpage", "tomainpage");
                            (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
                        }
                    }
                }
                else
                {
                    (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Skins/SelectLanguage.xaml", UriKind.Relative));
                }
            }
        }

        public bool isarabicchecked
        {
            get
            {
                return GetValueOrDefault<bool>(isarabiccheckedname, isarabiccheckedDefault);
            }
            set
            {
                if (AddOrUpdateValue(isarabiccheckedname, value))
                {
                    Save();
                }
            }
        }
4

1 回答 1

1

可能发生的情况是 UI 层(Silverlight)响应用户的点击,愉快地改变自己的状态,然后设置 isenglishchecked 或 isarabicchecked 的值。属性值不变这一事实无关紧要——Silverlight 没有注意到。(不更改属性值以响应 set 调用是非标准行为,因此 Silverlight 会像这样“行为不端”也就不足为奇了)

您可以尝试以下几件事:

  1. 在两个属性的设置处理程序中,为 isenglishchecked 和 isarabicchecked 引发 PropertyChanged 事件(在 INotifyPropertyChanged 中)。这将导致 UI 重新查询视图模型,使其重新同步。如果选中的属性没有改变,UI 会注意到这一点。
  2. 在每个 RadioButton 上使用内置的ExceptionValidationRule,然后在用户取消操作时在 Set 处理程序中引发异常。这可能会导致单选按钮的值不变(好),但也可能使您的按钮变为红色。
  3. 定义您自己的ValidationRule。在 ValidationRule.Validate 期间显示消息框可能会更好。
  4. 完全放弃确认对话框,立即更改语言。如果这是一个错误,用户可以点击另一个按钮。
于 2013-06-25T14:34:01.630 回答