[SilverLight]扩展UserControl实现弹出效果

    感觉SilverLight的编程方式更像WinForm一点,要是有WinForm中的Show方法和ShowDialog方法就可以更灵活的操作窗口了,这次我们就来给SilverLight的UserControl增加这两个方法:分别是Show() and ShowAsModal()。
基本原理是写个UserControl的基类BaseUserControl,在基类中实现这两个方法,需要弹出的UserControl继承这个基类就可以了,具体这两个方法的实现方式是利用SilverLight的PopUp对象。

如下代码就是我抄来并修改的UserControl基类:

ContractedBlock.gif ExpandedBlockStart.gif BaseUserControl
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;

namespace ExpandUserControl
{
    
public class BaseUserControl : UserControl
    {
         
#region 私有字段
        Popup popup;
        Grid grid;
        Canvas canvas;
        
#endregion
        
        
/// <summary>
        
/// 构造函数
        
/// </summary>
        public BaseUserControl()
        {
            popup 
= new Popup();
            grid 
= new Grid();
            popup.Child 
= grid;
           
        }

        
protected virtual void OnClickOutside() { }

        
#region 公共方法

        
public void Show()
        {
            UpdateSize();
            grid.Children.Add(
this);
            popup.IsOpen 
= true;

        }
        
public void ShowAsModal()
        {
            canvas 
= new Canvas();
            UpdateSize();
            canvas.Background 
= new SolidColorBrush(Colors.Black);
            canvas.Opacity 
= 0.2;
            canvas.MouseLeftButtonDown 
+= (sender, args) => { OnClickOutside(); };
            grid.Children.Add(canvas);
            grid.Children.Add(
this);
            popup.IsOpen 
= true;
        }

        
public void Close()
        {
            
if (popup != null)
            {
                popup.IsOpen 
= false;
                
//popup = null;
                
//grid = null;
                
//canvas = null;
            }
        }
        
#endregion
        
#region 私有方法

        
private void UpdateSize()
        {
            grid.Width 
= Application.Current.Host.Content.ActualWidth;
            grid.Height 
= Application.Current.Host.Content.ActualHeight;
            
if (canvas != null)
            {
                canvas.Width 
= grid.Width;
                canvas.Height 
= grid.Height;
            }
        }
        
#endregion
    }
}

代码比较简单,实现Show方法就是PopUp里面套个Grid再加UserControl,实现ShowAsModal就是PopUp里面套个Grid在增加一个黑色透明度等于0.2的Canvas再加上UserControl,UpdateSize()私有方法是把grid和Canvas设置成和当前显示内容同等宽高,这样UserControl就可以显示在中央;提供了一个OnClickOutside()的虚方法供重载调用。
然后写个UserControl并继承这个BaseUserControl,这里有个问题,把cs文件里继承的UserControl改成BaseUserCotrol后,还要把xaml进行相应的修改,修改方式如下代码:

ContractedBlock.gif ExpandedBlockStart.gif MyUserControl
<uc:BaseUserControl x:Class="ExpandUserControl.UserControls.MyUserControl"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:uc
="clr-namespace:ExpandUserControl">
    
<Grid x:Name="LayoutRoot" Cursor="Hand">
        
<uc:DialogPanel x:Name="myDialog" Background="White" Height="80" Width="300" Title="弹出框" DragEnable="True" >
            
<uc:DialogPanel.Content>
                
<StackPanel Orientation="Horizontal" Margin="10" HorizontalAlignment="Center">
                    
<Image Source="../Images/alert_icon.png" Stretch="None"></Image>
                    
<TextBlock x:Name="info" TextWrapping="Wrap" VerticalAlignment="Center" FontSize="12"/>
                
</StackPanel>
            
</uc:DialogPanel.Content>
        
</uc:DialogPanel>
    
</Grid>
</uc:BaseUserControl>

这里使用了基于Silverlight的精简框架之应用 http://www.cnblogs.com/guozili/archive/2008/11/23/1338150.html里面的控件。
调用方式比较简单:

ContractedBlock.gif ExpandedBlockStart.gif uc
 MyUserControl uc = new MyUserControl("这是一个ShowAsModal的示例!");
            uc.ShowAsModal();

解决方案下载,祝大家圣诞快乐!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值