【问题标题】:Windows phone 7, grabbing listboxitem name and passing it to another xaml pageWindows phone 7,获取 listboxitem 名称并将其传递给另一个 xaml 页面
【发布时间】:2011-07-10 23:38:12
【问题描述】:

我有两个 XAML 页面。一页(名为 Page1)有一个名为“strangers”的列表框,在该列表框内有 ListBoxItems。

我的第二个页面被命名为:Page2。

每当有人从 Page1 中点击 ListBoxItem 时,ListBoxItem 的名称就会转移到另一个 XAML 页面 Page2,Page2 将在其中读取 ListboxItem 名称,然后根据 LisBoxItem 名称,用文本填充页面。

顺便说一下,我想遍历数百个listboxitem,它们都调用同一个函数Ge​​neral_MouseLeftButtonDown,并根据被点击的listboxitem的名称动态改变页面的内容。

所有内容将在启动时出现在手机中。

但是似乎有一个问题——我无法让它发挥作用。这是我的代码,希望对大家有所帮助。

Page1 Xaml 信息:

<ListBox x:Name="Strangers" Margin="0,0,-12,0">

    <ListBoxItem x:Name="Peter">
        <StackPanel Orientation="Horizontal" Margin="0,0,0,17" MouseLeftButtonDown="General_MouseLeftButtonDown">
        </StackPanel>
    </ListBoxItem>

Page1 C# 信息:

    PhoneApplicationService phoneAppService = PhoneApplicationService.Current;

    private void General_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var namers="";

        namers= (sender as ListBoxItem).Name.ToString();

        phoneAppService.State["theperson"] = namers;


        NavigationService.Navigate(new Uri("/Page2.xaml", UriKind.Relative));
    }

Page2 C#:

PhoneApplicationService phoneAppService = PhoneApplicationService.Current;

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        object something="";

        if (phoneAppService.State.ContainsKey("theperson"))
        {
            if (phoneAppService.State.TryGetValue("theperson", out something))
            {
                string namers = something.ToString();
                Textblock.Text = namers;
            }
        }
    }

但是,当我运行它时,我得到的错误是在我单击 listboxitem 以转换页面之后。我收到以下错误:

NullReferenceException

关于

namers= (sender as ListBoxItem).Name.ToString();

我是否正确执行此 XAML 数据传输?显然出了点问题,但我不能完全理解是什么或为什么。

【问题讨论】:

    标签: c# windows-phone-7 transition isolatedstorage


    【解决方案1】:

    您应该使用QueryStrings 而不是State。后者旨在用于当您的应用程序被墓碑化并且您希望返回同一页面而不会丢失输入的任何信息时使用。 QueryStrings 用于将数据以字符串格式传输到另一个页面。

    所以,第 1 页 C#:

    private void General_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var namers="";
    
        namers= (sender as ListBoxItem).Name.ToString();
    
    
    
        NavigationService.Navigate(new Uri("/Page2.xaml?name=" + namers, UriKind.Relative));
    }
    

    第 2 页

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
    
        string namers="";
    
        NavigationContext.QueryString.TryGetValue("name", out namers)
    
        Textblock.Text = namers;
    
    }
    

    我在第 2 页所做的是检索 name 的值(这是我在查询字符串中用作键的值,但您可以使用任何东西)。使用TryGetValue,而不是直接检查索引(NavigationContext.QueryString["name"])意味着如果失败了,它会返回一个false而不是抛出一个异常。您可以根据需要检查返回的布尔值,但似乎不需要,因为 namers 已经初始化为 ""

    【讨论】:

    • 实际上解决了我自己的问题,KeyboardP 也感谢您的输入。我更改了我的代码以反映您的更改。然而,我的代码的问题是我在我的 NOT my 中错误地将“General_MouseLeftButtonDown”事件处理程序包含为父级。因此,每次尝试触发 General_MouseLeftBUttonDown 时,它都引用了 stackpanel 子项中不存在的内容。再次,给你键盘P的道具。
    • 没有问题,很高兴你把它整理好了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多