zoukankan      html  css  js  c++  java
  • 稳扎稳打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
    [源码下载]
  • 相关阅读:
    初步认识虚函数(三)
    初步认识虚函数(二)
    C++遍历目录+_finddata_t结构体用法
    初步认识虚函数(一)
    gSOAP 使用WebServer心得
    如何优雅的写UI——(6)内存泄漏
    如何优雅的写UI——(5)选项卡功能实现
    如何优雅的写UI——(4)选项卡美化
    变色字体
    如何优雅的写UI——(3)添加MFC选项卡
  • 原文地址:https://www.cnblogs.com/webabcd/p/1498420.html
Copyright © 2011-2022 走看看