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

Windows Phone 7 自定义弹出窗口

[复制链接]
YunVN网友  发表于 2015-5-8 09:42:12 |阅读模式
  Windows Phone内置的MessageBox弹出窗口局限性太大,不能满足各种个性化的弹出窗口的需求,即使使用第三方的控件库也会有一些局限性,又或者封装的东西太多了,那么这时候就需要自己去根据自己的需求去自定义一个弹出窗口了。
  大概的原理就是使用Popup控件来实现弹出窗的效果,Popup控件可以把包含在其中的控件显示在最外面,从而可以把当前页面的控件都给盖住了,再加点半透明的效果,若隐若现的,一个弹窗就出来了。好吧,下面来看一下Demo。
  先看一下demo的结构。
DSC0000.jpg
  Generic.xaml




   
        
        
        
        
        
        
        
        
            
               
                    
                        
                        
                           
                                
                           
                        
                    
               
            
        
   

  



using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;
using Microsoft.Phone.Controls;
namespace MessageControl
{
    public class MyMessage : ContentControl
    {
        private System.Windows.Controls.ContentPresenter body;
        private System.Windows.Shapes.Rectangle backgroundRect;
        private object content;
        public MyMessage()
        {
            //这将类的styleKey设置为MyMessage,这样在模板中的style才能通过TargetType="local:MyMessage"与之相互绑定
            this.DefaultStyleKey = typeof(MyMessage);
        }
        //重写OnApplyTemplate()方法获取模板样式的子控件
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            this.body = this.GetTemplateChild("body") as ContentPresenter;
            this.backgroundRect = this.GetTemplateChild("backgroundRect") as Rectangle;
            InitializeMessagePrompt();
        }
        //使用Popup控件来制作弹窗
        internal Popup ChildWindowPopup
        {
            get;
            private set;
        }
        //获取当前应用程序的UI框架PhoneApplicationFrame
        private static PhoneApplicationFrame RootVisual
        {
            get
            {
                return Application.Current == null ? null : Application.Current.RootVisual as PhoneApplicationFrame;
            }
        }
        //弹窗的内容,定义为object,可以赋值为各种各样的控件
        public object MessageContent
        {
            get
            {
                return this.content;
            }
            set
            {
                this.content = value;
            }
        }
        //隐藏弹窗
        public void Hide()
        {
            if (this.body != null)
            {
                //关闭Popup控件
                this.ChildWindowPopup.IsOpen = false;
            }
        }
        //判断弹窗是否打开
        public bool IsOpen
        {
            get
            {
                return ChildWindowPopup != null && ChildWindowPopup.IsOpen;
            }
        }
        //打开弹窗
        public void Show()
        {
            if (this.ChildWindowPopup == null)
            {
                this.ChildWindowPopup = new Popup();
                this.ChildWindowPopup.Child = this;
            }
            if (this.ChildWindowPopup != null && Application.Current.RootVisual != null)
            {
                InitializeMessagePrompt();
                this.ChildWindowPopup.IsOpen = true;
            }
        }
        //初始化弹窗
        private void InitializeMessagePrompt()
        {
            if (this.body == null)
                return;
            this.backgroundRect.Visibility = System.Windows.Visibility.Visible;
            //把模板中得body控件内容赋值为你传过来的控件
            this.body.Content = MessageContent;
            this.Height = 800;
        }
    }
}
  
  
  简单地创建有一个控件作为弹窗的内容,测试一下弹窗的效果,当然弹窗的控件你可以定义为你想要的各种内容。
  WindowsPhoneControl1.xaml




   
        
        
        
   



using System.Windows;
using System.Windows.Controls;
namespace TestMessageControl
{
    public partial class WindowsPhoneControl1 : UserControl
    {
        public WindowsPhoneControl1()
        {
            InitializeComponent();
        }
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            (App.Current as App).myMessage.Hide();
        }
    }
}
  
  在App.xaml.cs中定义为全局弹窗



namespace TestMessageControl
{
    public partial class App : Application
    {
        ……
        public MyMessage myMessage = new MyMessage { MessageContent = new WindowsPhoneControl1() };
        ……
    }
}
  
  MainPage.xaml.cs
  单击事件



using Microsoft.Phone.Controls;
using MessageControl;
namespace TestMessageControl
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            (App.Current as App).myMessage.Show();
        }
    }
}
  
  好了,来看一下运行的效果吧。
DSC0001.jpg DSC0002.jpg
  
  欢迎购买我的书籍《深入浅出Windows Phone 7应用开发》 感谢大家的支持!!
  http://product.dangdang.com/product.aspx?product_id=22624989
DSC0003.jpg
  

运维网声明 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-64883-1-1.html 上篇帖子: Windows 7安装 Visual Studio 2010之大战三大回合 下篇帖子: 不可或缺 Windows Native (7)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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