2012-10-15 20 views
0

我有一個列表選擇器,它顯示在我的手機應用程序頁面中。我已經在類的開始創建列表選擇器,並且我正在phoneApplicationPage_loaded()方法中添加列表選擇器。頁面首次啓動時,該場景完美運行,並進一步導航到第二頁。當我回到上一頁(包含列表選擇器)時,它顯示無效操作異常,說明「元素已經是另一個元素的子元素。 「如何處理Wp7中的列表選擇器

我想知道如何處理這些情況?

代碼如下

命名空間My.Design { 公共部分類MyClass的:的PhoneApplicationPage {

String[] values = null; 
    ListPicker picker = new ListPicker(); 
    StackPanel sp; 
    StackPanel mainFrame; 
    String statementInfo = ""; 

    public myclass() 
    { 
     InitializeComponent(); 
    } 

    private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     Debug.WriteLine("Phone Application Page Loaded_>>>>>>"); 
     List<String> source = new List<String>(); 
     displayUI();     

    } 

    public void displayUI() 
    { 
     Debug.WriteLine("About to display UI in miniStatement"); 
     Debug.WriteLine("<-------------Data--------->"); 
     Debug.WriteLine(statementInfo); 
     Debug.WriteLine("<-------------Data--------->"); 
     int count = VisualTreeHelper.GetChildrenCount(this); 
     if (count > 0) 
     { 
      for (int i = 0; i < count; i++) 
      { 
       UIElement child = (UIElement)VisualTreeHelper.GetChild(this, i); 
       string childTypeName = child.GetType().ToString(); 
       Debug.WriteLine("Elements in this Child" + childTypeName); 
      } 
     } 
     List<String> source = new List<String>(); 

     String[] allParams = ItemString.Split('@'); 
     source.Add("PleaseSelect"); 
     for (int i = 0; i < allParams.Length; i++) 
     { 
      Debug.WriteLine("All Params Length" + allParams[i]); 
      if (!(allParams[i].Equals("") && (!allParams[i].Equals(null)))) 
      { 
       if (values != null) 
       { 
        Debug.WriteLine("Values length" + values.Length); 
        values[values.Length] = allParams[i]; 
       } 
       else 
       { 
        Debug.WriteLine("Allparams Length" + allParams[i]); 
        source.Add(allParams[i]); 
       } 

      } 

     } 
     //picker = new ListPicker(); 
     this.picker.ItemsSource = source; 

     mainFrame = new StackPanel(); 
     TextBlock box = new TextBlock(); 
     box.Text = "> DEmoClass"; 
     box.FontSize = 40; 

     mainFrame.Children.Add(box); 
     Canvas canvas = new Canvas(); 
     StackPanel sp = new StackPanel(); 
     TextBlock box1 = new TextBlock(); 
     box1.Text = "Number"; 
     box1.HorizontalAlignment = HorizontalAlignment.Center; 
     box1.FontSize = 40; 
     SolidColorBrush scb1 = new SolidColorBrush(Colors.Black); 
     box1.Foreground = scb1; 
     sp.Children.Add(box1); 
     picker.Width = 400; 
     picker.Height = 150; 
     sp.Children.Add(picker); 
     Canvas.SetTop(sp, 150); 
     canvas.Children.Add(sp); 
     mainFrame.Children.Add(canvas); 
     this.ContentPanel1.Children.Add(mainFrame); 
    } 
    protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e) 
    { 
     /* 
     Debug.WriteLine("OnNavigatingFrom>>>.>>MainPage"); 
     if (sp != null) 
     { 
      sp.Children.Remove(picker); 
     }*/ 
     base.OnNavigatingFrom(e); 
    } 

} 

}

+0

請你提供一些代碼。 – KyorCode

+0

添加的代碼,你可以檢查它並告訴我 – Rakesh

回答

1

如果你不打算回導航後更新listpicker從第二頁在您的Loaded事件處理程序中添加以下行

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.Loaded -= PhoneApplicationPage_Loaded; 
    Debug.WriteLine("Phone Application Page Loaded_>>>>>>"); 
    List<String> source = new List<String>(); 
    displayUI();     

} 
+0

感謝nkChandra爲您的輸入,我不能使用這個選項,你suggessted我,因爲,我不能使用這種情況下,當我的應用程序得到墓碑,有沒有什麼辦法來區分該應用程序是墓碑或者不是。我能夠解決這個問題,通過在XAml中創建stackPanel,並通過頁面加載,我做的像「如果(comboHolder.Children.Contains(picker)) comboHolder.Children.Remove(picker); 「刪除,然後最後添加選擇器,這種方式的工作,是否有任何建議,你可以給我這個 – Rakesh

0

我不知道爲什麼當應用從墓碑恢復時不能使用這種情況。

發生錯誤是因爲當你回到你的頁面時,加載的事件再次運行。

順便說一下,

Application_Activated的說法可以告訴你的應用程序恢復從墓碑或不是 - 。

如果(e.IsApplicationInstancePreserved)
{

IsTombstoning = false;  

}
其他
{

IsTombstoning = true;  

}

0

我很好奇,爲什麼你在創造它代碼,而不是把它留在XAML中?此外,錯誤來自您試圖將其添加到可能只有單個內容元素的位置兩次的事實。你試圖解決的更高層次的問題是什麼?