0

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

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

代码如下

命名空间 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);
    }

}

}

4

3 回答 3

1

如果您不打算在从第二页导航回来后更新列表选择器,请在 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();                   

}
于 2012-10-15T06:25:25.860 回答
0

我不知道为什么当应用程序从墓碑恢复时你不能使用这种情况。

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

顺便一提,

Application_Activated 的参数可以告诉您应用程序是否从墓碑中恢复--。

如果(e.IsApplicationInstancePreserved)
{

   IsTombstoning = false;    

}
其他
{

   IsTombstoning = true;    

}

于 2012-10-15T07:53:54.453 回答
0

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

于 2012-10-17T05:19:34.553 回答