稳扎稳打Silverlight(32) - 2.0Tip/Trick之MessageBox, Popup, 循环的几种实现方法, 动态变换主题, 本地化(多语言), 响应鼠标双击事件

[索引页]
[源码下载]


稳扎稳打Silverlight(32) - 2.0Tip/Trick之MessageBox, Popup, 循环的几种实现方法, 动态变换主题, 本地化(多语言), 响应鼠标双击事件


作者: webabcd


介绍
Silverlight 2.0 提示和技巧系列
  • MessageBox - MessageBox 的演示 
  • Popup - Popup 弹窗口的演示 
  • 循环的几种实现方法 - DispatcherTimer 方式, Storyboard 方式, Timer 方式,  CompositionTarget.Rendering 方式
  • 动态变换主题 - 演示如何动态地变换主题 
  • 本地化(多语言) - 演示如何实现对多语言的支持
  • 响应鼠标双击事件 - 响应并处理鼠标的双击事件


在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html


示例
1、演示 MessageBox
MessageBoxDemo.xaml 
< UserControl  x:Class ="Silverlight20.Tip.MessageBoxDemo"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< Grid  x:Name ="LayoutRoot"  Background ="White" >
        
< StackPanel >
            
< Button  x:Name ="btnMessageBox"  Content ="MessageBox 演示"  Click ="btnMessageBox_Click"  Margin ="5"   />
            
< TextBlock  x:Name ="lblResult"   />
        
</ StackPanel >
    
</ Grid >
</ UserControl >

MessageBoxDemo.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  Silverlight20.Tip
{
    
public partial class MessageBoxDemo : UserControl
    
{
        
public MessageBoxDemo()
        
{
            InitializeComponent();
        }


        
private void btnMessageBox_Click(object sender, RoutedEventArgs e)
        
{
            MessageBoxResult result 
= MessageBox.Show("信息""标题", MessageBoxButton.OKCancel);

            lblResult.Text 
+= result.ToString();
        }

    }

}



2、演示 Popup 弹出窗口
PopupDemo.xaml
< UserControl  x:Class ="Silverlight20.Tip.PopupDemo"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< Grid  x:Name ="LayoutRoot"  Background ="White" >
        
< Button  x:Name ="btnPopup"  Content ="弹出新窗口"  Margin ="5"  Width ="80"  Height ="40"  Click ="btnPopup_Click"  HorizontalAlignment ="Left"  VerticalAlignment ="Top"   />
    
</ Grid >
</ UserControl >

PopupDemo.xaml.cs
/*
 * 如果需要 Silverlight 宿主可以使用 HtmlPage.PopupWindow() 弹出新窗口,则需要如下参数
 * <param name="allowHtmlPopupWindow" value="true" />
 * 此参数:同域时默认为 ture ; 跨域时默认为 false
 
*/


using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

using  System.Windows.Browser;

namespace  Silverlight20.Tip
{
    
public partial class PopupDemo : UserControl
    
{
        
public PopupDemo()
        
{
            InitializeComponent();
        }


        
private void btnPopup_Click(object sender, RoutedEventArgs e)
        
{
            
// HtmlPopupWindowOptions - 需要弹出的新窗口的参数(如果浏览器是以标签的形式打开新窗口,则此参数无效)
            HtmlPopupWindowOptions opt = new HtmlPopupWindowOptions();
            opt.Left 
= 0;
            opt.Top 
= 0;
            opt.Width 
= 320;
            opt.Height 
= 240;

            
// HtmlPage.IsPopupWindowAllowed - 指定 Silverlight 宿主是否可以使用 HtmlPage.PopupWindow() 来弹出新的浏览器窗口
            
// HtmlPage.PopupWindow() - 弹出新窗口
            if (true == HtmlPage.IsPopupWindowAllowed) 
                HtmlPage.PopupWindow(
new Uri("http://webabcd.cnblogs.com/", UriKind.Absolute), "newWindow", opt);
        }

    }

}



3、做循环程序的几种实现方法
LoopsDemo.xaml
< UserControl  x:Class ="Silverlight20.Tip.LoopsDemo"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< Grid  x:Name ="LayoutRoot"  Background ="White" >
        
< StackPanel >
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >
                
< TextBlock  Text ="DispatcherTimer: "   />
                
< TextBlock  x:Name ="resultDispatcherTimer"   />
            
</ StackPanel >
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >
                
< TextBlock  Text ="Timer: "   />
                
< TextBlock  x:Name ="resultTimer"   />
            
</ StackPanel >
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >
                
< TextBlock  Text ="StoryBoard: "   />
                
< TextBlock  x:Name ="resultStoryBoard"   />
            
</ StackPanel >
            
< StackPanel  Orientation ="Horizontal"  Margin ="5" >
                
< TextBlock  Text ="CompositionTarget: "   />
                
< TextBlock  x:Name ="resultCompositionTarget"   />
            
</ StackPanel >
        
</ StackPanel >
    
</ Grid >
</ UserControl >

LoopsDemo.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

using  System.Windows.Threading;
using  System.Threading;

namespace  Silverlight20.Tip
{
    
public partial class LoopsDemo : UserControl
    
{
        
public LoopsDemo()
        
{
            InitializeComponent();

            
this.Loaded += new RoutedEventHandler(LoopsDemo_Loaded);
        }


        
void LoopsDemo_Loaded(object sender, RoutedEventArgs e)
        
{
            DispatcherTimerDemo();
            StoryboardDemo();
            TimerDemo();
            CompositionTargetDemo();
        }



        
/// <summary>
        
/// DispatcherTimer - 在 UI 线程上循环(会受到 UI 线程的影响)
        
/// </summary>

        private void DispatcherTimerDemo()
        
{
            DispatcherTimer dTimer 
= new DispatcherTimer();
            dTimer.Interval 
= TimeSpan.Zero;
            dTimer.Tick 
+= new EventHandler(dTimer_Tick);
            dTimer.Start();
        }


        
void dTimer_Tick(object sender, EventArgs e)
        
{
            resultDispatcherTimer.Text 
= DateTime.Now.ToString("hh:mm:ss fff");
        }



        Storyboard _board;
        
/// <summary>
        
/// Storyboard - 在非 UI 线程上循环
        
/// </summary>

        private void StoryboardDemo()
        
{
            _board 
= new Storyboard();
            _board.Duration 
= TimeSpan.Zero;
            _board.Completed 
+= new EventHandler(_board_Completed);
            _board.Begin();
        }


        
void _board_Completed(object sender, EventArgs e)
        
{
            resultStoryBoard.Text 
= DateTime.Now.ToString("hh:mm:ss fff");
            _board.Begin();
        }



        Timer _timer;
        
/// <summary>
        
/// Timer - 在非 UI 线程上循环
        
/// </summary>

        private void TimerDemo()
        
{
            _timer 
= new Timer(_timer_CallBack, null, TimeSpan.Zero, TimeSpan.Zero);
        }


        
private void _timer_CallBack(object state)
        
{
            
this.Dispatcher.BeginInvoke(() =>
            
{
                resultTimer.Text 
= DateTime.Now.ToString("hh:mm:ss fff");
            }
);
            _timer.Change(TimeSpan.Zero, TimeSpan.Zero);
        }



        
/// <summary>
        
/// CompositionTarget.Rendering - 每呈现 1 帧都会触发此事件(相当于 Flash 的 Event.ENTER_FRAME)
        
/// </summary>

        private void CompositionTargetDemo()
        
{
            CompositionTarget.Rendering 
+= new EventHandler(CompositionTarget_Rendering);
        }


        
void CompositionTarget_Rendering(object sender, EventArgs e)
        
{
            resultCompositionTarget.Text 
= DateTime.Now.ToString("hh:mm:ss fff");
        }

    }

}



4、动态变换主题(以 Toolkit 中的主题为例,引用 System.Windows.Controls.Theming.Toolkit.dll 和需要用到的相关主题文件)
ThemeDemo.xaml
< UserControl  x:Class ="Silverlight20.Tip.ThemeDemo"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< Grid  x:Name ="LayoutRoot"  Background ="White" >
        
< Button  Content ="ExpressionDark 样式"  Width ="120"  Height ="40"  VerticalAlignment ="Top"  HorizontalAlignment ="Left"  Margin ="5"  Click ="Button_Click" ></ Button >
    
</ Grid >
</ UserControl >

<!--
    
在 xaml 文件中声明的方式使用主题
    
<UserControl x:Class="Silverlight20.Tip.ThemeDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:myTheme="clr-namespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.Toolkit">
    <Grid x:Name="LayoutRoot" Background="White"
          myTheme:ImplicitStyleManager.ApplyMode="Auto" 
          myTheme:ImplicitStyleManager.ResourceDictionaryUri="/Silverlight20;component/Theme/System.Windows.Controls.Theming.ExpressionDark.xaml"
    >
        <Button Content="ExpressionDark 样式" Width="120" Height="40" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="5"></Button>
    </Grid>
</UserControl>
-->

ThemeDemo.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

using  System.Windows.Controls.Theming;

namespace  Silverlight20.Tip
{
    
public partial class ThemeDemo : UserControl
    
{
        
public ThemeDemo()
        
{
            InitializeComponent();
        }


        
private void Button_Click(object sender, RoutedEventArgs e)
        
{
            
// 设置主题的路径并将其赋值给需要使用该主题的控件
            Uri uri = new Uri("/Silverlight20;component/Theme/System.Windows.Controls.Theming.ExpressionDark.xaml", UriKind.Relative);
            ImplicitStyleManager.SetResourceDictionaryUri(LayoutRoot, uri);

            
// 设置主题的应用模式后,将主题应用到指定的控件,此控件内的所用控件都将使用该主题
            ImplicitStyleManager.SetApplyMode(LayoutRoot, ImplicitStylesApplyMode.Auto);
            ImplicitStyleManager.Apply(LayoutRoot);
        }

    }

}



5、演示如何实现本地化(多语言的支持)
LocalizationDemo.xaml
< UserControl  x:Class ="Silverlight20.Tip.LocalizationDemo"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:res
="clr-namespace:Silverlight20.Resource" >
    
< StackPanel  Orientation ="Vertical" >
        
        
< StackPanel  Margin ="5" >
            
< TextBlock  Text ="姓名: "   />
            
< TextBlock  x:Name ="lblName"   />
            
< TextBlock   Text ="年龄: "   />
            
< TextBlock  x:Name ="lblAge"   />
        
</ StackPanel >

        
<!-- 通过声明的方式调用指定的本地化资源 -->
        
< StackPanel.Resources >
            
< res:Localization  x:Name ="myRes"   />
        
</ StackPanel.Resources >
        
< StackPanel  Margin ="5" >
            
< TextBlock  Text ="姓名: "   />
            
< TextBlock  Text =" {Binding Name, Source={StaticResource myRes}} "   />
            
< TextBlock   Text ="年龄: "   />
            
< TextBlock  Text =" {Binding Age, Source={StaticResource myRes}} "   />
        
</ StackPanel >
        
    
</ StackPanel >
</ UserControl >

LocalizationDemo.xaml.cs
/*
 * 配置本地化资源,如本例中需要添加 Localization.resx, Localization.zh-CN.resx 和 Localization.en-US.resx文件
 * 要在资源文件中设置好相应的 Name 和 Value
 * 本例中,要把 Silverlight20.Resource.Localization 类及其构造函数的访问级别手动修改为 Public 
 * 打开项目文件,本例为 Silverlight20.csproj,对需要支持的本地化资源做配置,本例为 <SupportedCultures>zh-CN;en-US</SupportedCultures>
 * 具体如何实现本地化,可以查 MSDN 中的 CultureInfo
 * 如何指定需要调用的本地化资源:在 object 的 param 中指定;在 Application_Startup 中指定
 
*/


using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

namespace  Silverlight20.Tip
{
    
public partial class LocalizationDemo : UserControl
    
{
        
public LocalizationDemo()
        
{
            InitializeComponent();

            
this.Loaded += new RoutedEventHandler(LocalizationDemo_Loaded);
        }


        
void LocalizationDemo_Loaded(object sender, RoutedEventArgs e)
        
{
            
// 通过编程的方式调用指定的本地化资源
            lblName.Text = Resource.Localization.Name;
            lblAge.Text 
= Resource.Localization.Age;
        }

    }

}

在 Application 中指定 Culture
private   void  Application_Startup( object  sender, StartupEventArgs e)
{
    
// 通过如下方法来实现本地化(指定资源)
    CultureInfo culture = new CultureInfo("zh-CN");
    System.Threading.Thread.CurrentThread.CurrentCulture 
= culture;
    System.Threading.Thread.CurrentThread.CurrentUICulture 
= culture;


    
this.RootVisual = new Page();
}

在 object 标记中指定 Culture
<!-- 演示如何在 Silverlight 中实现本地化 -->
<!-- 通过为 object 标记设置如下参数来实现本地化(指定资源) -->
< param  name ="culture"  value ="en-US"   />
< param  name ="uiculture"  value ="en-Us"   />


6、响应并处理鼠标的双击事件
DoubleClick.xaml
< UserControl  x:Class ="Silverlight20.Tip.DoubleClick"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" >
    
< Grid  x:Name ="LayoutRoot"  Background ="White" >
        
< StackPanel >
            
< Button  x:Name ="btn"  Content ="Double Click Me"  Margin ="5"  Click ="btn_Click"   />
            
< TextBox  x:Name ="result"  Margin ="5"   />
        
</ StackPanel >
    
</ Grid >
</ UserControl >

DoubleClick.xaml.cs
/*
 * 根据 DispatcherTimer 是否为启动状态判断在某一时间段内是否按了两次鼠标左键
 *     第一按鼠标左键则启动 DispatcherTimer,双击或者到了间隔时间则停止 DispatcherTimer
 *     每次按键,如果 DispatcherTimer 为启动状态,即为双击
 
*/


using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

using  System.Windows.Threading;

namespace  Silverlight20.Tip
{
    
public partial class DoubleClick : UserControl
    
{
        DispatcherTimer _dTimer;

        
public DoubleClick()
        
{
            InitializeComponent();

            
this.Loaded += new RoutedEventHandler(DoubleClick_Loaded);
        }


        
void DoubleClick_Loaded(object sender, RoutedEventArgs e)
        
{
            _dTimer 
= new DispatcherTimer();
            _dTimer.Interval 
= TimeSpan.FromMilliseconds(300);
            _dTimer.Tick 
+= new EventHandler(_dTimer_Tick);
        }


        
private void btn_Click(object sender, RoutedEventArgs e)
        
{
            
if (_dTimer.IsEnabled)
            
{
                result.Text 
+= "双击";
                _dTimer.Stop();
            }

            
else
            
{
                _dTimer.Start();
            }

        }


        
void _dTimer_Tick(object sender, EventArgs e)
        
{
            _dTimer.Stop();
        }

    }

}



OK
[源码下载]

你可能感兴趣的:(silverlight)