2014-03-07 57 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