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

手把手玩转win8开发系列课程(21)

[复制链接]

尚未签到

发表于 2015-5-20 11:18:57 | 显示全部楼层 |阅读模式
  这节,有三个议程①定位控件②显示用户控件③将用户控件添加到项目中
  (1)定位控件
  Metro布局控件没有提供了一种简单相对定位的布局方式,因此,在项目中你需要做一下灵活的处理了。下面就展示了我在Flyouts文件夹下写的FlyoutHelper类的情况,他定义了一个ShowRelativeToAppBar的方法。这个方法的职责是十分单一的,就是讲这个 用户控件定位到appBar Button控件旁边了。为了实现这样的效果,我们所需要的是一个popup control,一点击的这个按钮,就出现上述弹出用户控件的情况,尽管,这个方法看起来并不是那么的好了,但这也是我能解决这个问题想到的唯一的解决方法。



1 using System;
2 using Windows.Foundation;
3 using Windows.UI.Xaml;
4 using Windows.UI.Xaml.Controls;
5 using Windows.UI.Xaml.Controls.Primitives;
6 namespace MetroGrocer.Flyouts {
7   public class FlyoutHelper {
8     public static void
9 //显示控件的相对定位的方法
10 //通过一个相应的代理来解决的
11 //计算的思路是计算前后左右的距离
12
13 ShowRelativeToAppBar(Popup popup, Page page,
14       AppBar appbar, Button button) {
15       Func getOffset =
16         delegate(UIElement control1, UIElement control2) {
17           return control1.TransformToVisual(control2)
18             .TransformPoint(new Point(0, 0));
19         };
20       Point popupOffset = getOffset(popup, page);
21       Point buttonOffset = getOffset(button, page);
22       popup.HorizontalOffset = buttonOffset.X - popupOffset.X
23         - (popup.ActualWidth / 2) + (button.ActualWidth / 2);
24       popup.VerticalOffset = getOffset(appbar, page).Y
25         - popupOffset.Y - popup.ActualHeight;
26       if (popupOffset.X + popup.HorizontalOffset
27         + popup.ActualWidth > page.ActualWidth) {
28         popup.HorizontalOffset = page.ActualWidth
29           - popupOffset.X - popup.ActualWidth;
30       } else if (popup.HorizontalOffset + popupOffset.X < 0) {
31         popup.HorizontalOffset = -popupOffset.X;
32       }
33     }
34   }
35 }
  
  Popup的位置是出现在appBar的前面,他隐藏在屏幕的左部和右部。至于要我深入源代码的讲解的话,我看还是没有这么样必要吧,因为可能win8正式版上面,这样做的更好吧。至于,你碰到过某个问题吧,我这里告诉你他的先查相应的资料,再深挖他的实质,这是我多年来的编程经验  

ShowRelativeToAppBar方法是展示弹出窗口周围位置的对话框,这个方法就是用于判断HorizonOffset判断其中的距离,VerticalOffset判断其中的垂直的距离。这样经过一定处理,能够实现了定位了。

  (2)展示这个弹出对话框
  至于HomeZipCodeFlyout类除了展示数据以外,另外一个职责就是显示和隐藏这个弹出控件,这里有很多很多方法使其弹出吗,我这里当然是使用最简单的解决方案。下列源代码展示了一种数据绑定的方式。



1
2
  
  至于数据绑定,默认是one-way绑定,这就意味着我只能页面展示的数据随着后台数据变,反之亦然。而two-way方式,则是意味着后台数据(View Model)与前台展示互相关联、
  
  特别提醒,我这里没有必要设置dataContext进行了绑定,但你一旦把这个用户控件添加到页面这种去了,由于是页面级对象,他也继承了DataContext这个属性、
  言归正卷,怎么弹出隐藏控件了,隐藏此控件很好解决嘛,可以通过ok按钮的控制解决嘛。由于two-way绑定的模式,我根本不用担心数据是否保持同步的问题。当然了,不可能有事情十全十美,这么做的最大的缺点就是在控件消失前,他已经更新数据多次,影响效率,还有影响界面中另外viewmodel的界面了。但对于HomeZip这个属性,也很好,因为zip是唯一的。所以了这种方法不失为一个解决这个问题的理想方法。
  (3)向程序中添加FlyOut控件
  怎么将其添加到主界面上出了,你就可以用以下代码:



1
2
11   
12     
13      
14      
15     
16     
17      
18      
19     
20     
21       // …contents removed for brevity
22     
23     
24       // …contents removed for brevity
25     
26
27       // …contents removed for brevity
28     
29
30   
31   
32   
33     // …contents removed for brevity
34   
35
  
  在xaml中引用命名空间很简单,就像下面一样:



1 xmlns:flyouts="using:MetroGrocer.Flyouts"
  最重要的,不是引用什么命名空间,而是引用命名空间以后,引用其中的用户控件,用户控件的源代码如下所示:



1
  注意了,该弹出窗口是在grid控件中了,尽管他不是立马显示了,但一定布局在grid控件中了,这是一个原则,主页面才能更好控制子元素。
  哝——这样一个控件就能添加到项目中了
  

运维网声明 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-68854-1-1.html 上篇帖子: Win8 Metro App里玩XNA:框架问题解决方案 下篇帖子: 记今晚帮哥们解决的一个问题:文件恢复(win8下)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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