Windows Phone 7中的应用栏

时间:2011-07-01 10:09:16

标签: windows-phone-7

我正在尝试在Windows Phone 7应用程序中创建一个应用程序栏。 但我认为点击事件存在一些问题,因为有时它会起作用,有时候它不起作用。

以下是xaml.cs中的代码。

XAML

    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="False">
        <shell:ApplicationBarIconButton IconUri="/Icons/appbar.edit.rest.png" Text="Edit" Click="btnEdit_Click" IsEnabled="True"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/appbar.delete.rest.png" Text="Delete" Click="btnDelete_Click" IsEnabled="True"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/appbar.feature.email.rest.png" Text="Email"  Click="btnEmail_Click" IsEnabled="True"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/appbar.back.rest.png" Text="Back" Click="btnBack_Click" IsEnabled="True"/>

    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

的.cs

 void btnBack_Click(object sender, EventArgs e)

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

    void btnDelete_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Can click");
    }

任何人都可以帮助我。感谢。

1 个答案:

答案 0 :(得分:1)

我能想到的一种可能情况是,Library页面有一个繁重的构造函数,因此导航到该页面需要很长时间。这种情况可能会让你产生一种幻觉,即你按下按钮两次三次并且你认为它没有工作,而第一个按钮已被触发但你的线程仍在考虑构建下一页。

尝试使用非常简单的消息框而不是导航来查看此猜测是否为真。

如果是,则尝试使您的页面构造函数尽可能轻,并将数据加载到“Asynchronus”和“OnNavigatedTo”。

对于数据加载: 您可能正在阅读要在“库”页面上加载的项目列表。加载项目需要从文件系统,Web服务或任何其他媒体中读取它们,这些都是耗时且可能阻止UI的。您需要在OnNavigatedTo中执行此操作(以确保它在用户导航到页面后启动)并且异步地执行此操作:

public override void OnNavigatedTo(...)
{
    System.Threading.ThreadPool.QueueUserWorkItem(LoadData);
}

void LoadData(object o)
{
    res = // load data from media.
    Deployment.Current.Dispatcher.BeginInvoke(() => 
    {
        // add res to your page
    });
}

您在页面后面的代码中直接编写的任何内容都将在UI Thread上运行(除了由单独的线程处理的动画)。因此,您需要在单独的线程中保留与UI无关的任务(以上面显示的方式)。

请注意,您仍然需要在UI线程中触发UI更改,否则您将获得“Corss-thread exception”。 (这就是为什么我们在Dispatcher.BeginInvoke中调用代码)。