设为首页 收藏本站
查看: 1212|回复: 0

(三)实例讲解win8(XAML+C#)开发--------课程表:弹出菜单ContextMenu和弹窗Flyout

[复制链接]

尚未签到

发表于 2015-5-20 12:42:19 | 显示全部楼层 |阅读模式
  免责声明:本文章由fengyun1989创作,采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
  友情提示下:win8下,输入法切换是window键+空格键。
  下面我们来做的是一个弹窗来修改课程表里面的数据。那么我们用一个弹窗来实现数据的修改。那么用什么方式控制弹窗呢,用一个AppBar的按钮?我觉得还是在页面点击弹出比较好,我想用listView的某个事件来实现弹窗,但是我对win8里面的ListView的事件不太熟悉,查文档?我比较懒,懒得查文档也有两种方式,一种用智能提示,一种用属性页面的事件页。
  从智能提示看到,可以选择的事件挺多的,我就选择DoubleTap.那么在ItemDetail页面添加一个DoubleTap事件:




  那么我们在DoubleTap事件中实现弹出菜单。这里就先给出微软官方的ContextMenu的例子:http://code.msdn.microsoft.com/windowsapps/Context-menu-sample-40840351
  ContextMenu有两种,一种是普通就弹出菜单,一种是选择文本后的弹出菜单。这里就用第一种,后一种是可以在选择文本后弹出菜单显示复制,粘贴等。后一种可以在微软给出的例子的Scenario2页面看到。
  修改DoubleTap事件如下:



        private async void ScheduleList_DoubleTapped_1(object sender, DoubleTappedRoutedEventArgs e)
{
if (ScheduleList.SelectedIndex != -1)
{
var menu = new PopupMenu();
menu.Commands.Add(new UICommand("Edit", (command) =>
{
}));
menu.Commands.Add(new UICommand("Delete", (command) =>
{
}));
await menu.ShowAsync(e.GetPosition(null));
}
}
  注意,这里的方法要修改为异步的,async和await这两个配合,await这个关键字,在win8才有,从字面文字就知道,就是等待后面的完成。用了await方法修饰,后面跟的要是异步的方法,整个方法也要用async修饰成异步的方法。关于await,推荐看:深入探究 WinRT 和 await
  现在运行,在ListView上双击,就可以看到弹窗了。
DSC0000.png
  接下来,我们做一个弹窗来修改数据。那么,用什么样的形式弹窗呢,在Wp7,我们可以用Canvas自定义弹窗,也有不少的第三方插件可以做到。当然,这里我们也可由用Canvas来自定义弹窗,不过这里我不打算这么做,我打算用win8有的一个弹窗Popup来实现。那么现在新建添加一个用户控件到Pages文件夹命名为EditItemFlyout.xaml。
  去除原来的Grid修改代码如下:


































  修改后台代码如下:



public void Show()
{
EditItemPopup.IsOpen = true;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
var schedule = this.DataContext as ScheduleItem;
schedule.LessonName = Lessonname.Text;
schedule.ClassRoom = Classroom.Text;
schedule.StartTime = Starttime.Text;
schedule.EndTime = Endtime.Text;
EditItemPopup.IsOpen = false;
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
EditItemPopup.IsOpen = false;
}
  这里的前台做了数据的绑定。后台Button1确定数据更新。
  另外在这里多说下,我现在这个编译器,每次在这个用户控件这个页面,鼠标在设计器多晃几下,编译器就有种挂了的感觉,经过研究,其实是设计器的预览模块惹的祸。如果感觉如此,就打开任务管理器。
  就会看到如下:
DSC0001.png 这里圈出来的就是设计器部分,占用率很高,直接把圈出来的这个进程这个终结了就好了。不晓得这个是我机子的原因还是编译器的问题,另外,Vs2012的智能提示不太好,在前台设置的Name属性,在后台智能提示不行,还得生成下才行。
  下面修改ItemDetail页面,在Listview后面添加这么一些代码:




  并且修改ListView的DoubleTap事件:



private async void ScheduleList_DoubleTapped_1(object sender, DoubleTappedRoutedEventArgs e)
{
if (ScheduleList.SelectedIndex != -1)
{
var menu = new PopupMenu();
menu.Commands.Add(new UICommand("Edit", (command) =>
{
EditFlyout.DataContext = ((WeekdayItem)this.DataContext).ScheduleList[ScheduleList.SelectedIndex];
EditFlyout.Show();
}));
menu.Commands.Add(new UICommand("Delete", (command) =>
{
((WeekdayItem)this.DataContext).ScheduleList.RemoveAt(ScheduleList.SelectedIndex);
}));
await menu.ShowAsync(e.GetPosition(null));
}
}
  上面代码做了就是显示Flyout和数据的绑定,删除的时候就对数据修改删除就好了。现在编译运行,就能看到弹窗,修改或者删除都能实现了。
DSC0002.png
  下面做Weekdaylist的弹出菜单来作为添加删除等。那么也用DoubleTap事件吧。
  WeekdayList的doubleTap事件如下:



        private async void weekdayList_DoubleTapped_1(object sender, DoubleTappedRoutedEventArgs e)
{
var menu = new PopupMenu();
menu.Commands.Add(new UICommand("Add Weekday", (command) =>
{
ItemDetailFrame.Navigate(typeof(AddWeekday), viewModel);
}));
menu.Commands.Add(new UICommand("Add Schedule", (command) =>
{
if (weekdayList.SelectedIndex != -1)
{
ItemDetailFrame.Navigate(typeof(AddSchedule), viewModel);
}
}));
menu.Commands.Add(new UICommand("Delete this Item", (command) =>
{
if (weekdayList.SelectedIndex != -1)
{
viewModel.WeekdayList.RemoveAt(weekdayList.SelectedIndex);
}
}));
await menu.ShowAsync(e.GetPosition(null));
}
  addWeekday,Addschedule是两个页面,ItemDetail这个Frame导航到这两个页面,并且传入viewModel这个数据。来实现数据的更新。
  现在新建两个页面AddSchedule,AddWeekday到Pages文件夹,代码如下:
  AddSchedule前台如下:


























  上面定义了数据的布局。
  后台代码:(添加一个声明和在onnavigateto的时候获取数据源,在点击添加和取消的时候并完成页面导航)



private ViewModel viewModel;


protected override void OnNavigatedTo(NavigationEventArgs e)
{
viewModel = e.Parameter as ViewModel;
}
private void Addschedule_Click_1(object sender, RoutedEventArgs e)
{
if (Lessonname.Text.Length

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-68913-1-1.html 上篇帖子: (四)实例讲解win8(XAML+C#)开发--------课程表:Snapped模式和动态磁贴,徽章(badge) 下篇帖子: win8下 dreamweaver cs6 代码颜色配色方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表