稳扎稳打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://webabcd.blog.51cto.com/1787395/342779


示例
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,popup,MessageBox,稳扎稳打,Trick)