zoukankan      html  css  js  c++  java
  • Silverlight4中右键菜单实现附源码下载

    在发布Silverlight4 Beta版本和RC时 增加不少新的特性和控件. 类似在WinForm实现右键菜单ContentMenu功能. 在Silverlight 4中也有所体现.

    当初在Silverlight4还是beta版本时 就有很多人问我如何实现右键菜单功能. 当时beta版本更新只是增加两个右键点击事件.分别为:

    MouseRightButtonDown   MouseRightButtonUp [右键按下和释放事件]

    在绝大多数情况下这个右击事件被开发人员用来做了右键菜单, 而最新发布的Toolkit for March 2010里新增加了一个ContextMenu控件来实现右击菜单的功能.Silverlight4正式版中增加了所有UIElement 对MouseRightButtonDownMouseRightButtonUp操作支持,总而言之是改进一大.这让我们实现其一个右键菜单ContentMenu更加快捷简便.

    先看看实现效果:右键点击文本框显示ContentMenu

      Get Microsoft Silverlight

    具体效果如上 为了达到演示目的 我做了一个比较简单运用,其中也涉及到剪切板部分操作. 具体实现步骤如下:

    A:创建一个默认的Silverlight应用程序即可 记住Silverlight版本选择4.0. 页面布局:

     1   <!--Excepetcion:Property Contentmenu does not support value the type grid-->
     2 <Canvas x:Name="LayoutRoot" Width="450" Height="400" Background="White">
     3 
     4         <TextBlock Text="Right Click ContextMenu in Silverlight 4" FontSize="16" Foreground="Red" Canvas.Top="12" Canvas.Left="12" Height="23" Width="357"></TextBlock>
     5         <TextBox x:Name="tb" Text="Select Text and Right Click" Canvas.Left="59" Canvas.Top="49" Height="26" Width="300" />
     6             <my:ContextMenuService.ContextMenu>
     7                 <my:ContextMenu Name="mymenu">
     8                     <my:MenuItem Header="Cut" Click="MenuItem_Click"/>
     9                     <my:MenuItem Header="Copy" Click="MenuItem_Click"/>
    10                     <my:Separator/>
    11                     <my:MenuItem Header="Paste" Click="MenuItem_Click"/>
    12                   <my:MenuItem x:Name="definemyself" Click="MenuItem_Click">
    13                     <my:MenuItem.Header>
    14                         <StackPanel Orientation="Horizontal">
    15                             <Image Source="/TestSilverlightRightMouseClickDemo;component/Images/Vis_F_blue_Lo-res.jpg" Width="30" Height="30" />
    16                             <TextBlock Text="附带有Image样式" Padding="5"></TextBlock>
    17                         </StackPanel>
    18                    </my:MenuItem.Header>
    19                    
    20                 </my:MenuItem>
    21                 <my:MenuItem Header="Chenkai制作右键菜单Demo" Click="MenuItem_Click"/>
    22             </my:ContextMenu>
    23             </my:ContextMenuService.ContextMenu>
    24        
    25     </Canvas>

    页面布局采用的是Canvas. 当初在从ToolKit中拖入ContextMenu控件时提示一个异常信息:"Exceptcion:Property Contentmenu does not support value the type grid”

    把默认布局Grid改成Canvas默认定位即可.

    可能你已经注意到了, 我使用的附加属性的ContextMenuService.ContextMenu,主要原因在WPF中 你可以使用FrameWorkElement.ContextMenu属性将ContextMenu附加到一个元素,但在Silverlight中不支持,所以ContextMenuService.ContextMenu也提供了类似的功能.

    B:ContextMenu中添加多个MenuItem,为了演示我对菜单并没有美化效果. 后台的Click="MenuItem_Click"事件代码如下:

     1    private void MenuItem_Click(object sender, RoutedEventArgs e)
     2         {
     3             MenuItem menuItem = (MenuItem)sender;
     4             switch (menuItem.Header.ToString())
     5             {
     6                 case "Cut":
     7                     Clipboard.SetText(tb.SelectedText);
     8                     tb.SelectedText = "";
     9                     tb.Focus();
    10                     break;
    11                 case "Copy":
    12                     Clipboard.SetText(tb.SelectedText);
    13                     tb.Focus();
    14                     break;
    15                 case "Paste":
    16                     tb.SelectedText = Clipboard.GetText();
    17                     break;
    18                 case "Chenkai制作右键菜单Demo":
    19                     MessageBox.Show("Author:chenkai Date:2010年5月27日11:09:51 文章附有源码下载 :)!");
    20                     break;
    21                 default:
    22                     break;
    23             }
    24             mymenu.IsOpen = false;
    25         }

     C:注意事项

    (1)当第一次运行程序时右键单击文本框 浏览器提示:

    其实到这了解Silverlight 4新特性朋友应该能看出来. 4.0版本中增加了对摄像头、剪切板等的用户对话框 ,用于用户选择操作.当启用剪切板后才能正常演示该程序, 否则会提示一个异常信息. "Application OPerator Exception:没有启用剪切板".

    (2)剪切板的使用:

    在上面的代码,我们编程时访问该菜单项被点击的ContextMenu做的TextBox的剪切,复制和粘贴来操作剪贴板,具体操作提示如下:

    Clipboard.SetText() 从一个Silverlight应用程序数据复制到剪贴板

    Clipboard.GetText() 从剪切板中获得Copy复制数据

    Cut剪切则只需使用Clipboard.SetText(),并设置当前选择的内容到一个空字符串 即可 操作简便.为了演示目的, 如果想了解更多可找一些新特性文章查看详细操作. 

    有人也许会问如果没有正式版版本的ContextMenu控件如何利用两个右击事件实现这Menu右击菜单效果.? 其实这个在Beta时就没有这个控件, 但依然能够实现.具体的操作请参见风云的风云的银光志Silverlight4.0教程之使用鼠标右键事件和滚轮事件.也很简单不在这里不再赘述.

    当然细心朋友也能够看出. 能不能把这个Menu右键菜单 做成多个级别关联的.Silverlight 4.0 Beta版本是不支持的, 上例中我也做了尝试.但尚未成功!希望有实现这方面的经验相告.. 转载请注明出去.如有疑问请在留言中回复.源代码下载如下:

    Silverlight 4.0 右击菜单实现:/Files/chenkai/TestSilverlightRightMouseClickDemo.rar

  • 相关阅读:
    五年磨一剑未成
    通过实例学习 VSL Hello World
    Web3d明日之星基于Javascript和OpenGL的技术
    将自己常去Web3D网站整理到文章中来
    FreeBSD,比较安静
    通过实例学习Virtools脚本语言VSL 合并字符串
    关于SQLite
    android中AsyncTask和Handler对比
    JavaScript中Array的prototype运用
    WampServer2.X 安装与使用说明
  • 原文地址:https://www.cnblogs.com/chenkai/p/1745257.html
Copyright © 2011-2022 走看看