如何在Wp7中处理列表选择器

时间:2012-10-15 05:51:54

标签: windows-phone-7

我有一个列表选择器,它显示在我的手机应用程序页面中。我在课程开始时创建了列表选择器,我在phoneApplicationPage_loaded()方法中添加了列表选择器。当页面第一次启动时, ,该场景完美地工作,并进一步导航到第二页。当我导航回上一页(包含列表选择器)时,它显示无效操作异常发生,说明“元素已经是另一个元素的子节点”。

我想知道如何处理这些情况?

代码低于

命名空间My.Design {     public partial class 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);
    }

}

}

3 个答案:

答案 0 :(得分: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();                   

}

答案 1 :(得分:0)

我不知道为什么当应用程序从逻辑删除恢复时你不能使用那种情况。

发生

错误,因为当您返回页面时,加载的事件会再次运行。

顺便说一下,

Application_Activated的论点可以告诉你应用程序恢复是否为逻辑删除 - 。

if(e.IsApplicationInstancePreserved)
   {

   IsTombstoning = false;    

}
   否则
   {

   IsTombstoning = true;    

}

答案 2 :(得分:0)

我很好奇你为什么要在代码中创建它而不是把它留在XAML中?此外,错误来自于您尝试将其两次添加到可能只有一个内容元素的位置。您尝试解决的问题是什么?