2014-03-07 58 views
0

我正在创建一个Windows Phone应用程序,但我有一个小问题。Windows Phone C# - 设置页面 - 初始化

我正在使用MSDN示例中的AppSettings类来保存我的设置,这工作正常。

但是,在我的设置UI我有一个无线电输入。当每个无线电输入被检查时,我想让Visibility.Collaped或Visibility.Visible成为一个TextBox。它不允许我这样做,因为我猜AppSettings正在被初始化,并且每个工具箱都是空的时检查一个Radio Input。

设置页面正在AppSettings之后初始化,所以我该怎么做?

如果我运行下面的代码它给我的NullReferenceException在该行:

EnterRadiusBox.Visibility = Visibility.Collapsed; 

我希望你能理解我。

这里是代码我到目前为止在设置页面:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Net; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Navigation; 
    using Microsoft.Phone.Controls; 
    using Microsoft.Phone.Shell; 

    namespace MyAPP 
    { 
     public partial class Page1 : PhoneApplicationPage 
     { 
      public Page1() 
      { 
       InitializeComponent(); 
      } 

      private void OffersFromRadius_Checked(object sender, RoutedEventArgs e) 
      { 
       EnterRadiusBox.Visibility = Visibility.Visible; 
       RadiusExplain.Visibility = Visibility.Visible; 
      } 

      private void OffersFromCity_Checked(object sender, RoutedEventArgs e) 
      { 
       EnterRadiusBox.Visibility = Visibility.Collapsed; 
       RadiusExplain.Visibility = Visibility.Collapsed;   
      } 
     } 
    } 

,这里是我的Settings.xaml

<phone:PhoneApplicationPage 
     x:Class="MyAPP.Page1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
     xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     FontFamily="{StaticResource PhoneFontFamilyNormal}" 
     FontSize="{StaticResource PhoneFontSizeNormal}" 
     Foreground="{StaticResource PhoneForegroundBrush}" 
     SupportedOrientations="Portrait" Orientation="Portrait" 
     mc:Ignorable="d" 
     xmlns:local="clr-namespace:SettingsHandle" 
     ApplicationBar = "{StaticResource GlobalAppBar}" 
     shell:SystemTray.IsVisible="True"> 

     <phone:PhoneApplicationPage.Resources> 
      <local:AppSettings x:Key="appSettings"></local:AppSettings> 
     </phone:PhoneApplicationPage.Resources> 

     <!--LayoutRoot is the root grid where all page content is placed--> 
     <Grid x:Name="LayoutRoot" Background="Transparent"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 

      <!--TitlePanel contains the name of the application and page title--> 
      <StackPanel Grid.Row="0" Margin="12,17,0,28"> 
       <TextBlock Text="MyAPP" Style="{StaticResource PhoneTextNormalStyle}"/> 
       <TextBlock Text="Settings" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
      </StackPanel> 

      <!--ContentPanel - place additional content here--> 
      <Grid x:Name="ContentPanel" Grid.Row="1" Margin="14,0,10,0"> 
       <TextBlock HorizontalAlignment="Left" Margin="151,27,0,0" TextWrapping="Wrap" Text="Show Offers From" VerticalAlignment="Top" Height="30" Width="167"/> 
       <RadioButton x:Name="OffersFromCity" Content="My City" HorizontalAlignment="Left" Margin="67,57,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.818,0.428" GroupName="GroupOne" IsChecked="{Binding Source={StaticResource appSettings}, Path=OffersFromCitySetting, Mode=TwoWay}" Checked="OffersFromCity_Checked" /> 
       <RadioButton x:Name="OffersFromRadius" Content="A Radius" HorizontalAlignment="Left" Margin="246,57,0,0" VerticalAlignment="Top" GroupName="GroupOne" IsChecked="{Binding Source={StaticResource appSettings}, Path=OffersFromRadiusSetting, Mode=TwoWay}" Checked="OffersFromRadius_Checked" /> 
       <TextBox x:Name="EnterRadiusBox" HorizontalAlignment="Left" Height="72" Margin="92,124,0,0" TextWrapping="Wrap" Text="60" VerticalAlignment="Top" Width="296" InputScope="Number" /> 
       <TextBlock x:Name="RadiusExplain" HorizontalAlignment="Left" Margin="56,196,0,0" TextWrapping="Wrap" Text="I want to hide this value or make it visible." VerticalAlignment="Top" Height="84" Width="364" /> 
      </Grid> 


     </Grid> 

    </phone:PhoneApplicationPage> 

回答

0

这应该更好地与XAML绑定来解决,而不是C#码。

Cimbalino LIB添加到您的项目或自己添加一个BooleanToVisibilityConverter

如果使用Cimablino,下面的命名空间添加到<Application ...></Application>根节点您App.xaml内:

xmlns:conv="clr-namespace:Cimbalino.Phone.Toolkit.Converters;assembly=Cimbalino.Phone.Toolkit" 

,并添加下面<Application.Resources>该转换器在App.xaml

<conv:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 

然后,你可以绑定TextBox/TextBlock在您自己的代码中对匹配的Radiobox的可见性:

<RadioButton x:Name="OffersFromCity" GroupName="GroupOne" ... /> 
<RadioButton x:Name="OffersFromRadius" GroupName="GroupOne" ... /> 
<TextBox x:Name="EnterRadiusBox" Visibility="{Binding IsChecked, ElementName=OffersFromRadius, Converter={StaticResource BooleanToVisibilityConverter}}" ... /> 
<TextBlock x:Name="RadiusExplain" Visibility="{Binding IsChecked, ElementName=OffersFromRadius, Converter={StaticResource BooleanToVisibilityConverter}}" ... /> 

Visibility的绑定中,您应该使用名称为OffersFromRadius的元素的属性IsChecked。由于Visibility属性不知道bool是什么,我们需要转换器。该转换器将bool翻译为匹配的Visibility

+0

你真棒!谢谢 。它的工作:) – user3393046

+0

很高兴听到!我很感谢你将我的帖子标记为答案:)谢谢并祝你周末愉快! – sibbl