您的位置:首页 > 其它

silverlight中添加给TextBox批量添加右键菜单

2013-08-07 18:48 281 查看
基于此人写的代码,修改优化后支持批量给所有TextBox添加右键菜单,而菜单共用一个,节省资源。

public static class CreatMenuForTextBox
{
// 菜单
static ContextMenu menu;
//TextBox
static TextBox textbox;

/// <summary>
/// 为任意元素的内部TextBox添加右键菜单
/// </summary>
public static void creatMenu(DependencyObject obj)
{
menu = new ContextMenu();
menu.Items.Add(getItem("剪切", "../Images/1.jpg"));
menu.Items.Add(getItem("复制", null));
menu.Items.Add(getItem("粘贴", null));
menu.Items.Add(new Separator());
menu.Items.Add(getItem("选择全部", null));
menu.Opened += menu_Opened;
SetMenu(obj);
}

static void SetMenu(DependencyObject obj)
{
var count = VisualTreeHelper.GetChildrenCount(obj);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(obj, i);
if (child is TextBox)
{
((TextBox)child).MouseRightButtonDown += TextBox_MouseRightButtonDown;
}
else
{
SetMenu(child);
}
}
}

static void TextBox_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
textbox = sender as TextBox;
textbox.Focus();
menu.IsOpen = true;
}

static void menu_Opened(object sender, RoutedEventArgs e)
{
textbox.Focus();
}

static MenuItem getItem(string header, string imagePath)
{
MenuItem item = new MenuItem();
item.Header = header;
if (imagePath != null)
{
Image im = new Image();
im.Source = new ImageSourceConverter().ConvertFromString(imagePath) as ImageSource;
item.Icon = im;
}
item.Click += new RoutedEventHandler(item_Click);
return item;
}

static void item_Click(object sender, RoutedEventArgs e)
{
MenuItem menuItem = (MenuItem)sender;
try
{
execute(menuItem.Header.ToString());
}
catch (Exception)
{
}
textbox.Focus();
}

static void execute(string selected)
{
switch (selected)
{
case "剪切":
Clipboard.SetText(textbox.SelectedText);
textbox.SelectedText = "";
textbox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
break;
case "复制":
Clipboard.SetText(textbox.SelectedText);
break;
case "粘贴":
textbox.SelectedText = Clipboard.GetText();
textbox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
break;
case "选择全部":
textbox.SelectAll();
break;
default:
break;
}
}
}
2013-11-20修改:添加了剪切和粘贴动作对绑定数据源的更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Silverlight ContextMenu