WP8.1的Flyout控件

来源:互联网 发布:发型软件 编辑:程序博客网 时间:2024/04/28 06:37

对于大部分变成人员来说,弹出层的实现是必须的,不论是做交互还是提升应用可用性,美观性,都是必不可少的。

然后并不像JS实现弹出层那么简单,WP8.1的弹出层比较复杂。然而实现其功能却也是有很多种方法的。

可以先来总结下一些具有弹出效果的控件和类吧:

a.MessageDialog类,这是最简单的弹出框了

b.ContentDialog类,比a弹出框复杂一些,可以自定义,非常实用

b.DatePicker控件和TimePicker控件

e.ContentDialog类

f.Popup控件,博客链接: Windows Phone 8.1中的Popup 

要点一:

Flyout控件属于辅助控件,必须与其他控件一起结合起来才能实现其功能。取消的方法可以通过单击或者点击控件外

部即可取消浮出内容。

记住Flyout是用于交互的,所以一开始是不会显示出来的。只有通过用户交互性点击才能显示


要点二:

准确地说,一般VS中的控件都是可以与Flyout控件结合起来使用的,但是会稍有不同。

对于Button控件,可以直接与Flyout结合,如下代码:

[csharp] view plain copy
 print?
  1. <!--最基本的Flyout控件,自定义其浮出的内容-->  
  2.             <Button Content="Show Flyout">  
  3.                 <Button.Flyout>  
  4.                     <Flyout>  
  5.                         <StackPanel>  
  6.                             <TextBox PlaceholderText="<span style="font-family:KaiTi_GB2312;">名前を書いて下さい</span>"/>  
  7.                             <Button HorizontalAlignment="Right" Content="<span style="font-family:KaiTi_GB2312;">確認</span>"/>  
  8.                         </StackPanel>  
  9.                     </Flyout>  
  10.                 </Button.Flyout>  
  11.             </Button>  

然后如果不是Button控件的话,其他的控件也可以通过<FlyoutBase.AttachedFlyout>附

加属性将Flyout附加到控件上,如下代码:(这里以TextBlock为例)

[csharp] view plain copy
 print?
  1. <!--使用附加属性FlyoutBase.AttachedFlyout来实现Flyout控件-->  
  2.             <TextBlock Text="クリック" Tapped="TextBlock_Tapped" FontSize="20">  
  3.                 <FlyoutBase.AttachedFlyout>  
  4.                     <Flyout>  
  5.                         <TextBlock Text="こんにちは"/>  
  6.                     </Flyout>  
  7.                 </FlyoutBase.AttachedFlyout>  
  8.             </TextBlock>  

上述两种方法不同的是,前者Button控件结合Flyout控件时,Flyout是默认关联到了Click事件上的。

而后者非Button控件结合Flyout控件时,就需要在.CS中写对应的点击事件了。如下代码:

[csharp] view plain copy
 print?
  1. //通过FlyoutBase.ShowAttachedFlyout方法来展示出Flyout控件  
  2.         private void TextBlock_Tapped(object sender, TappedRoutedEventArgs e)  
  3.         {  
  4.             FrameworkElement element = sender as FrameworkElement;  
  5.             if(element!=null)  
  6.             {  
  7.                 FlyoutBase.ShowAttachedFlyout(element);  
  8.             }  
  9.         }  

要点三:

Flyout一共分为六种

Flyout,DatePickerFlyout,TimePickerFlyout,PickerFlyout,ListPickerFlyout,MenuFlyout

第一种很好理解,上文也说过,就不多说了。

第二种和第三种是关于选择日期和时间的弹出层,其实可以参考DatePicker控件和

TimerPicker控件。如下代码:

[csharp] view plain copy
 print?
  1. <!--浮出选择日期弹窗,点击确定后触发DatePicked时间,然后可以获取选中的日期-->  
  2.             <Button Content="Show DatePicker">  
  3.                 <Button.Flyout>  
  4.                     <DatePickerFlyout x:name="dp" DatePicked="dp_DatePicked"/>  
  5.                 </Button.Flyout>  
  6.             </Button>  
  7.             <!--浮出选择时间弹窗,点击确认后触发TimePicked时间,然后可以获取选中的时间-->  
  8.             <Button Content="Shwo TimePicker">  
  9.                 <Button.Flyout>  
  10.                     <TimePickerFlyout x:name="tp" TimePicked="tp_TimePicked"/>  
  11.                 </Button.Flyout>  
  12.             </Button>  

注意在.CS中写法即可:

[csharp] view plain copy
 print?
  1. //DatePickerFlyout的日期选中事件,在事件处理程序里面可以获取选中的日期  
  2.         private async void dp_DatePicked(DatePickerFlyout sender, DatePickedEventArgs args)  
  3.         {  
  4.             await new MessageDialog(args.NewDate.ToString()).ShowAsync();  
  5.         }  
  6.   
  7.         //TimePickerFlyout的时间选中事件,在事件处理程序里面可以获取选中的时间  
  8.         private async void tp_TimePicked(TimePickerFlyout sender, TimePickedEventArgs args)  
  9.         {  
  10.             await new MessageDialog(args.NewTime.ToString()).ShowAsync();  
  11.         }  


第四种和第五种都属于选择性的弹出层,弹出的层往往覆盖整个手机屏幕。重要的区别是后台的选中事件是什么。

PickerFlyout------------Confirmed事件

ListPickerFlyout--------ItemsPicked事件(数据绑定部分可以参考listview的

ItemTemplate模板的DataTemplate模板的写法)

代码如下:

XAML:

[csharp] view plain copy
 print?
  1. <!--浮出选择弹窗,显示底下的确认取消菜单栏并且处理器确认时间Confirmed-->  
  2.             <Button Content="Show Picker">  
  3.                 <Button.Flyout>  
  4.                     <PickerFlyout Confirmed="PickerFlyout_Confirmed" ConfirmationButtonsVisible="True">  
  5.                         <TextBlock Text="確認しますか?" FontSize="30" Margin="0,100,0,0"/>  
  6.                     </PickerFlyout>  
  7.                 </Button.Flyout>  
  8.             </Button>  
  9.             <!--浮出选择列表弹窗,绑定集合的数据,处理选中的事件ItemsPicked-->  
  10.             <Button Content="Show ListPicker">  
  11.                 <Button.Flyout>  
  12.                     <ListPickerFlyout x:Name="lpf" ItemsPicked="lpf_ItemsPicked">  
  13.                         <ListPickerFlyout.ItemTemplate>  
  14.                             <DataTemplate>  
  15.                                 <TextBlock Text="{Binding}" FontSize="40"></TextBlock>  
  16.                             </DataTemplate>  
  17.                         </ListPickerFlyout.ItemTemplate>  
  18.                     </ListPickerFlyout>  
  19.                 </Button.Flyout>  
  20.             </Button>  

.CS:

[csharp] view plain copy
 print?
  1. //绑定ListPickerFlyout数据源  
  2. listPickerFlyout.ItemsSource = new List<string> { "织田信长","丰成秀吉","德川家康","石田三成"};  

[csharp] view plain copy
 print?
  1. //PickerFlyout的确认事件,在事件处理程序里面可以处理相关的确认逻辑  
  2.         private async void PickerFlyout_Confirmed(PickerFlyout sender, PickerConfirmedEventArgs args)  
  3.         {  
  4.             await new MessageDialog("確認をクリックしました").ShowAsync();  
  5.         }  
  6.   
  7.         //ListPickerFlyout的选中事件,点击列表的某一项便会触发,在事件处理程序中通常会获取选中的项目来进行相关逻辑的处理  
  8.         private async void <span style="font-family:KaiTi_GB2312;">lpf</span>_ItemsPicked(ListPickerFlyout sender, ItemsPickedEventArgs args)  
  9.         {  
  10.             if(sender.SelectedItem!=null)  
  11.             {  
  12.                 await new MessageDialog("選択:"+sender.SelectedItem.ToString()).ShowAsync();  
  13.             }  
  14.         }  


第六种,也就是最后一种,代码如下:

XAML:

[csharp] view plain copy
 print?
  1. <!--浮出上下文菜单,点击后显示获取菜单栏的文本-->  
  2.             <Button x:Name="menuFlyoutButton" Content="Show MenuFlyout">  
  3.                 <Button.Flyout>  
  4.                     <MenuFlyout>  
  5.                         <MenuFlyoutItem x:name="mfi" Text="汤姆克鲁斯" Click="mfi_Click"/>  
  6.                         <MenuFlyoutItem x:name="mfi" Text="约翰尼德普" Click="mfi_Click"/>  
  7.                         <MenuFlyoutItem x:name="mfi" Text="威尔斯密斯" Click="mfi_Click"/>  
  8.                     </MenuFlyout>  
  9.                 </Button.Flyout>  
  10.             </Button>  
.CS:

[csharp] view plain copy
 print?
  1. //MenuFlyout的菜单选项的点击事件,点击后显示获取菜单栏的文本  
  2.         private async void MenuFlyoutItem_Click(object sender, RoutedEventArgs e)  
  3.         {  
  4.             await new MessageDialog((sender as MenuFlyoutItem).Text).ShowAsync();  
  5.         }  

运行截图:

总界面:


点击第一个按钮:



点击第二个按钮:

选择"汤姆克鲁斯":



点击第三个按钮:(第三个和第四个功能类似,所以这里只测试了DatePickerFlyout)



点击第五个按钮:



点击第六个按钮:


总代码:

XAML:

[csharp] view plain copy
 print?
  1. <Page  
  2.     x:Class="App6.TestPage"  
  3.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  4.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  5.     xmlns:local="using:App6"  
  6.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
  7.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
  8.     mc:Ignorable="d"  
  9.     Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">  
  10.   
  11.     <Grid>  
  12.         <StackPanel>  
  13.             <!--最基本的Flyout控件,自定义其浮出的内容-->  
  14.             <Button Content="Show Flyout">  
  15.                 <Button.Flyout>  
  16.                     <Flyout>  
  17.                         <StackPanel>  
  18.                             <TextBox PlaceholderText="名前を書いて下さい"/>  
  19.                             <Button HorizontalAlignment="Right" Content="確認"/>  
  20.                         </StackPanel>  
  21.                     </Flyout>  
  22.                 </Button.Flyout>  
  23.             </Button>  
  24.             <!--浮出上下文菜单,点击后显示获取菜单栏的文本-->  
  25.             <Button x:Name="menuFlyoutButton" Content="Show MenuFlyout">  
  26.                 <Button.Flyout>  
  27.                     <MenuFlyout>  
  28.                         <MenuFlyoutItem Text="汤姆克鲁斯" Click="MenuFlyoutItem_Click"/>  
  29.                         <MenuFlyoutItem Text="约翰尼德普" Click="MenuFlyoutItem_Click"/>  
  30.                         <MenuFlyoutItem Text="威尔斯密斯" Click="MenuFlyoutItem_Click"/>  
  31.                     </MenuFlyout>  
  32.                 </Button.Flyout>  
  33.             </Button>  
  34.             <!--浮出选择日期弹窗,点击确定后触发DatePicked时间,然后可以获取选中的日期-->  
  35.             <Button Content="Show DatePicker">  
  36.                 <Button.Flyout>  
  37.                     <DatePickerFlyout DatePicked="DatePickerFlyout_DatePicked"/>  
  38.                 </Button.Flyout>  
  39.             </Button>  
  40.             <!--浮出选择时间弹窗,点击确认后触发TimePicked时间,然后可以获取选中的时间-->  
  41.             <Button Content="Shwo TimePicker">  
  42.                 <Button.Flyout>  
  43.                     <TimePickerFlyout TimePicked="TimePickerFlyout_TimePicked"/>  
  44.                 </Button.Flyout>  
  45.             </Button>  
  46.             <!--浮出选择弹窗,显示底下的确认取消菜单栏并且处理器确认时间Confirmed-->  
  47.             <Button Content="Show Picker">  
  48.                 <Button.Flyout>  
  49.                     <PickerFlyout Confirmed="PickerFlyout_Confirmed" ConfirmationButtonsVisible="True">  
  50.                         <TextBlock Text="確認しますか?" FontSize="30" Margin="0,100,0,0"/>  
  51.                     </PickerFlyout>  
  52.                 </Button.Flyout>  
  53.             </Button>  
  54.             <!--浮出选择列表弹窗,绑定集合的数据,处理选中的事件ItemsPicked-->  
  55.             <Button Content="Show ListPicker">  
  56.                 <Button.Flyout>  
  57.                     <ListPickerFlyout x:Name="listPickerFlyout" ItemsPicked="listPickerFlyout_ItemsPicked">  
  58.                         <ListPickerFlyout.ItemTemplate>  
  59.                             <DataTemplate>  
  60.                                 <TextBlock Text="{Binding}" FontSize="45"></TextBlock>  
  61.                             </DataTemplate>  
  62.                         </ListPickerFlyout.ItemTemplate>  
  63.                     </ListPickerFlyout>  
  64.                 </Button.Flyout>  
  65.             </Button>  
  66.             <!--使用附加属性FlyoutBase.AttachedFlyout来实现Flyout控件-->  
  67.             <TextBlock Text="クリック" Tapped="TextBlock_Tapped" FontSize="20">  
  68.                 <FlyoutBase.AttachedFlyout>  
  69.                     <Flyout>  
  70.                         <TextBlock Text="こんにちは"/>  
  71.                     </Flyout>  
  72.                 </FlyoutBase.AttachedFlyout>  
  73.             </TextBlock>  
  74.             <Button Content="跳转到MainPage页面" x:Name="goto_btn" Click="goto_btn_Click"/>  
  75.         </StackPanel>       
  76.     </Grid>  
  77. </Page>  

.CS:

[csharp] view plain copy
 print?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.IO;  
  4. using System.Linq;  
  5. using System.Runtime.InteropServices.WindowsRuntime;  
  6. using Windows.Foundation;  
  7. using Windows.Foundation.Collections;  
  8. using Windows.UI.Popups;  
  9. using Windows.UI.Xaml;  
  10. using Windows.UI.Xaml.Controls;  
  11. using Windows.UI.Xaml.Controls.Primitives;  
  12. using Windows.UI.Xaml.Data;  
  13. using Windows.UI.Xaml.Input;  
  14. using Windows.UI.Xaml.Media;  
  15. using Windows.UI.Xaml.Navigation;  
  16.   
  17. // “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkID=390556 上有介绍  
  18.   
  19. namespace App6  
  20. {  
  21.     /// <summary>  
  22.     /// 可用于自身或导航至 Frame 内部的空白页。  
  23.     /// </summary>  
  24.     public sealed partial class TestPage : Page  
  25.     {  
  26.         public TestPage()  
  27.         {  
  28.             this.InitializeComponent();  
  29.             //绑定ListPickerFlyout数据源  
  30.             listPickerFlyout.ItemsSource = new List<string> { "织田信长","丰成秀吉","德川家康","石田三成"};  
  31.         }  
  32.   
  33.         /// <summary>  
  34.         /// 在此页将要在 Frame 中显示时进行调用。  
  35.         /// </summary>  
  36.         /// <param name="e">描述如何访问此页的事件数据。  
  37.         /// 此参数通常用于配置页。</param>  
  38.         protected override void OnNavigatedTo(NavigationEventArgs e)  
  39.         {  
  40.         }  
  41.   
  42.         //MenuFlyout的菜单选项的点击事件,点击后显示获取菜单栏的文本  
  43.         private async void MenuFlyoutItem_Click(object sender, RoutedEventArgs e)  
  44.         {  
  45.             await new MessageDialog((sender as MenuFlyoutItem).Text).ShowAsync();  
  46.         }  
  47.   
  48.         //DatePickerFlyout的日期选中事件,在事件处理程序里面可以获取选中的日期  
  49.         private async void DatePickerFlyout_DatePicked(DatePickerFlyout sender, DatePickedEventArgs args)  
  50.         {  
  51.             await new MessageDialog(args.NewDate.ToString()).ShowAsync();  
  52.         }  
  53.   
  54.         //TimePickerFlyout的时间选中事件,在事件处理程序里面可以获取选中的时间  
  55.         private async void TimePickerFlyout_TimePicked(TimePickerFlyout sender, TimePickedEventArgs args)  
  56.         {  
  57.             await new MessageDialog(args.NewTime.ToString()).ShowAsync();  
  58.         }  
  59.   
  60.         //PickerFlyout的确认事件,在事件处理程序里面可以处理相关的确认逻辑  
  61.         private async void PickerFlyout_Confirmed(PickerFlyout sender, PickerConfirmedEventArgs args)  
  62.         {  
  63.             await new MessageDialog("確認をクリックしました").ShowAsync();  
  64.         }  
  65.   
  66.         //ListPickerFlyout的选中事件,点击列表的某一项便会触发,在事件处理程序中通常会获取选中的项目来进行相关逻辑的处理  
  67.         private async void listPickerFlyout_ItemsPicked(ListPickerFlyout sender, ItemsPickedEventArgs args)  
  68.         {  
  69.             if(sender.SelectedItem!=null)  
  70.             {  
  71.                 await new MessageDialog("選択:"+sender.SelectedItem.ToString()).ShowAsync();  
  72.             }  
  73.         }  
  74.   
  75.         //通过FlyoutBase.ShowAttachedFlyout方法来展示出Flyout控件  
  76.         private void TextBlock_Tapped(object sender, TappedRoutedEventArgs e)  
  77.         {  
  78.             FrameworkElement element = sender as FrameworkElement;  
  79.             if(element!=null)  
  80.             {  
  81.                 FlyoutBase.ShowAttachedFlyout(element);  
  82.             }  
  83.         }  
  84.   
  85.         private void goto_btn_Click(object sender, RoutedEventArgs e)  
  86.         {  
  87.             this.Frame.Navigate(typeof(MainPage));  
  88.         }  
  89.   
  90.     }  
  91. }  

0 0
原创粉丝点击