我正在尝试在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");
}
任何人都可以帮助我。感谢。
答案 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中调用代码)。