博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows 8 Metro App开发[4]弹出画面(Flayouts)
阅读量:7242 次
发布时间:2019-06-29

本文共 3332 字,大约阅读时间需要 11 分钟。

1、创建自定义控件

    为了代码易于管理,在这里,我把弹出画面定义为一个自定义控件。也就是包含一个xaml文件和相关的代码文件。如下图所示,如何创建自定义控件:

选择用户控件,输入名称就可以了。

下图是创建好的画面

我将控件文件SearchFlayout存放在Flayouts文件夹下。

在xaml文件中添加如下代码

 

 

在代码中,需要提醒的是Popup的属性IsLightDismissEnabled="True"。这表示当用户点击或者触摸屏幕的任意位置,不包括Popup的位置,pop-up画面是否消失。当把Popup用作弹出画面时,这个属性必须设置为True,因为这是才符合基本的弹出画面(flyout)用户体验。

如下图所示,我们还可以在设计器中,看到自定义控件长什么样
在上面的代码中需要注意的是创建弹出画面必须使用Popup控件,至于Popup控件里面的内容就按需而定即可。我在这里用了TextBlock、TextBox和Button三个控件,当然还有一个StackPanel容器控件。

这样我们xaml文件就基本写完了。下面我们开始编写控件的C#代码

2、编写自定义控件代码
在这里,自定义控件中主要实现两个功能:显示控件本身和响应控件提供的相关用户交互操作大家看下面两个函数Show方法主要就是将自己显示出来。SearchButtonClick是响应自定义控件中的搜索按钮事件。
注意:在Show方法中有一行代码如下,是用来计算当前弹出画面需要显示的位置,后面会有讲解(由于目前的版本中微软并没有提供相关好的方法来获取显示的位置,所以需要自行计算,希望在windows 8正式版发布之后,能解决这个问题)
FlyoutHelper.ShowRelativeToAppBar(SearchPopup, page, appbar, button);

 

public void Show(Page page, AppBar appbar, Button button)  {      SearchPopup.IsOpen = true;                 FlyoutHelper.ShowRelativeToAppBar(SearchPopup, page, appbar, button);  } private void SearchButtonClick(object sender, RoutedEventArgs e)   {      SearchPopup.IsOpen = false;  }

3、定位弹出的控件(画面)

在这里我创建了一个FlyoutHelper类,其中定义了一个静态方法ShowRelativeToAppBar。这个方法计算出相关按钮上显示的Popup的正确位置,这样做,需要传入Popup控件、包含AppBar的Page、AppBar控件和被点击的button按钮。这个方法并不好,但这是我发现的可以获得flyout准确位置的唯一方法。具体代码如下:

namespace DevDiv_AppBar.Flayouts{    class FlyoutHelper    {        public static void ShowRelativeToAppBar(Popup popup, Page page, AppBar appbar, Button button)        {            Func
getOffset = delegate(UIElement control1, UIElement control2) { return control1.TransformToVisual(control2).TransformPoint(new Point(0, 0)); }; Point popupOffset = getOffset(popup, page); Point buttonOffset = getOffset(button, page); popup.HorizontalOffset = buttonOffset.X - popupOffset.X - (popup.ActualWidth / 2) + (button.ActualWidth / 2); popup.VerticalOffset = getOffset(appbar, page).Y - popupOffset.Y - popup.ActualHeight; if (popupOffset.X + popup.HorizontalOffset + popup.ActualWidth > page.ActualWidth) { popup.HorizontalOffset = page.ActualWidth - popupOffset.X - popup.ActualWidth; } else if (popup.HorizontalOffset + popupOffset.X < 0) { popup.HorizontalOffset = -popupOffset.X; } } }}

代码会将Popup定位在与其相关的AppBar按钮的上方,如果Popup从屏幕的左侧或右侧消失那么Popup将被重新定位,由于这代码比较恶心,我就不细讲了,希望在windows 8正式版发布之后,这个问题会得到解决。

4、在程序中使用弹出画面
将刚刚定义的控件添加到MainPage.xaml中,代码如下所示。
这里需要将名称空间添加进来using:DevDiv_AppBar.Flayouts 这样才能使用Flayouts中定义的控件。
下面的代码中,添加自定义控件是这行代码
<flyouts:SearchFlayout x:Name="SearchFlayout"/>
虽然这里并不是马上就显示出弹出画面,但是我们也需要把自定义控件声明为主程序布局的一部分。

 

 

5、显示弹出画面

现在代码基本编写完毕了,剩下的任务就是当用户点击AppBar上的搜索按钮时,将弹出画面显示出来即可。
我在MainPage.xaml.cs中添加如下代码:
并将该方法与AppBar的搜索按钮Click事件关联起来即可

 

private void AppBarButtonClick(object sender, RoutedEventArgs e){    if (e.OriginalSource == AppBarSearchButton)    {        SearchFlayout.Show(this, this.BottomAppBar, (Button)e.OriginalSource);    }}

 

原文地址:破船哥;

 

 

 

 

 

转载于:https://www.cnblogs.com/Yukang1989/archive/2013/02/06/2907726.html

你可能感兴趣的文章
Monkey 服务器项目开源授权协议更改
查看>>
《XSS跨站脚本攻击剖析与防御》—第6章6.5节利用Flash进行CSRF
查看>>
好的代码至少要修改两遍
查看>>
新零售时代的架构思考
查看>>
《Linux/UNIX系统编程手册(上、下册)》——第1章 历史和标准 1.1UNIX和C语言简史...
查看>>
《数据驱动安全:数据安全分析、可视化和仪表盘》一1.1 数据分析简史
查看>>
《大数据算法》一1.4 本书的内容
查看>>
《单片机串口通信及测控应用实战详解》——导读
查看>>
Chrome 将于 5 月底升级,届时大部分用户将不能使用 HTTP/2
查看>>
《游戏视频主播手册》——导读
查看>>
《精通Android 实例开发》——第1章,第1.2节在Windows环境下安装Eclipse
查看>>
90后CEO的开源心得:Github 2500 star是如何炼成的
查看>>
达芬奇有多努力?看看他当年的任务清单
查看>>
素数之魂——黎曼和他的伟大猜想
查看>>
【Java深入学习系列】之CPU的分支预测(Branch Prediction)模型
查看>>
《Axure RP7网站和APP原型制作从入门到精通》一1.4 交互基础
查看>>
腾讯Android自动化测试实战
查看>>
利用Java动态生成 PDF 文档
查看>>
《Unreal Engine 4蓝图可视化编程》一2.4 小结
查看>>
在 Linux 下使用 TCP 封装器来加强网络服务安全
查看>>