微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

稳扎稳打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 标记设置如下参数来实现本地化(指定资源) -->

< para name ="culture"  value ="en-US"   />

< para 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
[源码下载]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐