热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> Silverlight>>正文内容

Silverlight4中右键菜单实现-附源码下载

发布时间:2010年05月28日点击数: 佚名

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

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

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

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

先看看实现效果:

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

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(),并设置当前选择的内容到一个空字符串 即可 操作简便.为了演示目的, 如果想了解更多可找一些新特性文章查看详细操作. 

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作