Windows Phone 7 自定义弹出窗口

Windows Phone内置的MessageBox弹出窗口局限性太大,不能满足各种个性化的弹出窗口的需求,即使使用第三方的控件库也会有一些局限性,又或者封装的东西太多了,那么这时候就需要自己去根据自己的需求去自定义一个弹出窗口了。

大概的原理就是使用Popup控件来实现弹出窗的效果,Popup控件可以把包含在其中的控件显示在最外面,从而可以把当前页面的控件都给盖住了,再加点半透明的效果,若隐若现的,一个弹窗就出来了。好吧,下面来看一下Demo。

先看一下demo的结构。

 

 

Generic.xaml

 

  
  
  
  
  1. <ResourceDictionary 
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4.     xmlns:local="clr-namespace:MessageControl;assembly=MessageControl" 
  5.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  6.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"     
  7.     mc:Ignorable="d" 
  8.     > 
  9.     <Style TargetType="local:MyMessage"> 
  10.         <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilyNormal}"/> 
  11.         <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeNormal}"/> 
  12.         <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/> 
  13.         <Setter Property="Background" Value="Snow"/> 
  14.         <Setter Property="Width" Value="480" /> 
  15.         <Setter Property="Height" Value="800" /> 
  16.         <!--定义模板的Template--> 
  17.         <Setter Property="Template"> 
  18.             <Setter.Value> 
  19.                 <ControlTemplate TargetType="local:MyMessage"> 
  20.                     <Grid VerticalAlignment="Stretch"> 
  21.                         <Rectangle x:Name="backgroundRect" Grid.Row="0" Fill="Black" Opacity="0.7"/> 
  22.                         <Border   
  23.                             VerticalAlignment="Top"   
  24.                             BorderThickness="3"   
  25.                             BorderBrush="Black"> 
  26.                             <StackPanel Margin="0"> 
  27.                                 <ContentPresenter x:Name="body"/> 
  28.                             </StackPanel> 
  29.                         </Border> 
  30.                     </Grid> 
  31.                 </ControlTemplate> 
  32.             </Setter.Value> 
  33.         </Setter> 
  34.     </Style> 
  35. </ResourceDictionary> 

 

  
  
  
  
  1. using System.Windows;  
  2. using System.Windows.Controls;  
  3. using System.Windows.Shapes;  
  4. using System.Windows.Controls.Primitives;  
  5. using Microsoft.Phone.Controls;  
  6.  
  7. namespace MessageControl  
  8. {  
  9.     public class MyMessage : ContentControl  
  10.     {  
  11.         private System.Windows.Controls.ContentPresenter body;  
  12.         private System.Windows.Shapes.Rectangle backgroundRect;  
  13.         private object content;  
  14.  
  15.         public MyMessage()  
  16.         {  
  17.             //这将类的styleKey设置为MyMessage,这样在模板中的style才能通过TargetType="local:MyMessage"与之相互绑定  
  18.             this.DefaultStyleKey = typeof(MyMessage);  
  19.         }  
  20.         //重写OnApplyTemplate()方法获取模板样式的子控件  
  21.         public override void OnApplyTemplate()  
  22.         {  
  23.             base.OnApplyTemplate();  
  24.             thisthis.body = this.GetTemplateChild("body") as ContentPresenter;  
  25.             thisthis.backgroundRect = this.GetTemplateChild("backgroundRect") as Rectangle;  
  26.             InitializeMessagePrompt();  
  27.         }  
  28.         //使用Popup控件来制作弹窗  
  29.         internal Popup ChildWindowPopup  
  30.         {  
  31.             get;  
  32.             private set;  
  33.         }  
  34.         //获取当前应用程序的UI框架PhoneApplicationFrame  
  35.         private static PhoneApplicationFrame RootVisual  
  36.         {  
  37.             get  
  38.             {  
  39.                 return Application.Current == null ? null : Application.Current.RootVisual as PhoneApplicationFrame;  
  40.             }  
  41.         }  
  42.         //弹窗的内容,定义为object,可以赋值为各种各样的控件  
  43.         public object MessageContent  
  44.         {  
  45.             get  
  46.             {  
  47.                 return this.content;  
  48.             }  
  49.             set  
  50.             {  
  51.                 this.content = value;  
  52.             }  
  53.         }  
  54.         //隐藏弹窗  
  55.         public void Hide()  
  56.         {  
  57.             if (this.body != null)  
  58.             {  
  59.                 //关闭Popup控件  
  60.                 this.ChildWindowPopup.IsOpen = false;  
  61.             }  
  62.         }  
  63.         //判断弹窗是否打开  
  64.         public bool IsOpen   
  65.         {  
  66.             get   
  67.             {  
  68.                 return ChildWindowPopup != null && ChildWindowPopup.IsOpen;  
  69.             }   
  70.         }  
  71.         //打开弹窗  
  72.         public void Show()  
  73.         {  
  74.             if (this.ChildWindowPopup == null)  
  75.             {  
  76.                 this.ChildWindowPopup = new Popup();  
  77.                 thisthis.ChildWindowPopup.Child = this;  
  78.             }  
  79.  
  80.             if (this.ChildWindowPopup != null && Application.Current.RootVisual != null)  
  81.             {  
  82.                 InitializeMessagePrompt();  
  83.                 this.ChildWindowPopup.IsOpen = true;  
  84.             }  
  85.         }  
  86.         //初始化弹窗  
  87.         private void InitializeMessagePrompt()  
  88.         {  
  89.             if (this.body == null)  
  90.                 return;  
  91.             this.backgroundRect.Visibility = System.Windows.Visibility.Visible;  
  92.             //把模板中得body控件内容赋值为你传过来的控件  
  93.             this.body.Content = MessageContent;  
  94.             this.Height = 800;  
  95.         }  
  96.     }  

简单地创建有一个控件作为弹窗的内容,测试一下弹窗的效果,当然弹窗的控件你可以定义为你想要的各种内容。

WindowsPhoneControl1.xaml

 

  
  
  
  
  1. <UserControl x:Class="TestMessageControl.WindowsPhoneControl1" 
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  5.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  6.     mc:Ignorable="d" 
  7.     FontFamily="{StaticResource PhoneFontFamilyNormal}" 
  8.     FontSize="{StaticResource PhoneFontSizeNormal}" 
  9.     Foreground="{StaticResource PhoneForegroundBrush}" 
  10.     d:DesignHeight="250" d:DesignWidth="480"> 
  11.       
  12.     <Grid x:Name="LayoutRoot" Background="LightBlue"> 
  13.         <Button Content="是" Height="72" HorizontalAlignment="Left" Margin="40,169,0,0" Name="button1" VerticalAlignment="Top" Width="160" /> 
  14.         <Button Content="关闭" Height="72" HorizontalAlignment="Left" Margin="254,169,0,0" Name="button2" VerticalAlignment="Top" Width="160" Click="button2_Click" /> 
  15.         <TextBlock Height="53" HorizontalAlignment="Left" Margin="54,72,0,0" Name="textBlock1" Text="《深入浅出Windows Phone 7应用开发》" VerticalAlignment="Top" Width="369" /> 
  16.     </Grid> 
  17. </UserControl> 

 

  
  
  
  
  1. using System.Windows;  
  2. using System.Windows.Controls;  
  3.  
  4. namespace TestMessageControl  
  5. {  
  6.     public partial class WindowsPhoneControl1 : UserControl  
  7.     {  
  8.         public WindowsPhoneControl1()  
  9.         {  
  10.             InitializeComponent();  
  11.         }  
  12.  
  13.         private void button2_Click(object sender, RoutedEventArgs e)  
  14.         {  
  15.             (App.Current as App).myMessage.Hide();  
  16.         }  
  17.     }  

在App.xaml.cs中定义为全局弹窗

 

  
  
  
  
  1. namespace TestMessageControl  
  2. {  
  3.     public partial class App : Application  
  4.     {  
  5.         ……  
  6.  
  7.         public MyMessage myMessage = new MyMessage { MessageContent = new WindowsPhoneControl1() };  
  8.         ……  
  9.     }  

MainPage.xaml.cs

单击事件

 

  
  
  
  
  1. using Microsoft.Phone.Controls;  
  2. using MessageControl;  
  3.  
  4. namespace TestMessageControl  
  5. {  
  6.     public partial class MainPage : PhoneApplicationPage  
  7.     {  
  8.  
  9.         public MainPage()  
  10.         {  
  11.             InitializeComponent();  
  12.         }  
  13.  
  14.         private void button1_Click(object sender, RoutedEventArgs e)  
  15.         {  
  16.             (App.Current as App).myMessage.Show();  
  17.         }  
  18.     }  

好了,来看一下运行的效果吧。

 

 

欢迎购买我的书籍《深入浅出Windows Phone 7应用开发》 感谢大家的支持!!

http://product.dangdang.com/product.aspx?product_id=22624989

 

 

 

 

你可能感兴趣的:(windows,自定义,弹出窗口,phone,7)