fc2ブログ
 

Technology へようこそ
ここは技術者の「経験」と「ノウハウ」のブログです


2010年07月28日

ショートカットメニューの表示

Silverlight4でショートカットメニュー(いわゆる右クリックで表示されるメニュー、コントロール名としては ContextMenu)を表示する方法です。(要 Silverlight Toolkit)

XAML上に定義しても結局メニューコマンド実行用のコードは裏に書かざるをえないので、Another TLではコードビハインドで動的にメニューを生成しています。
まぁ、本当はもっとスマートなやり方があるんでしょうけど、変にXAMLとコードが分散するよりは見通し良いかな、と今のところは考えています。見栄えをいじりたければスタイルだけXAML定義しておく、とかすれぱ対応できるかと。

ちなみに、MenuItemのHeaderプロパティに別のコントロールを突っ込めば好き放題にメニューをカスタマイズできますが、ヘンテコUIになる可能性があるのでご注意をw

というわけで、テキストボックスコントロールにコピペ用のメニューを付けるサンプル。
XAMLは端折っちゃいましたが、対象となるTextBoxコントロールにMouseRightButtonDownイベントだけ用意してあげてください。Toolkitの参照設定もお忘れなく。
// コピペ用ショートカットメニューの表示
private void openContextMenu(TextBox txt, double posX, double posY)
{
ContextMenu cm = new ContextMenu();

var miCut = new MenuItem()
{
Header = "切り取り"
};
miCut.Click += (s, e) =>
{
txt.Focus();
Clipboard.SetText(txt.SelectedText);
txt.SelectedText = "";
};
cm.Items.Add(miCut);

var miCopy = new MenuItem()
{
Header = "コピー"
};
miCopy.Click += (s, e) =>
{
txt.Focus();
Clipboard.SetText(txt.SelectedText);
};
cm.Items.Add(miCopy);

var miPaste = new MenuItem()
{
Header = "貼り付け"
};
miPaste.Click += (s, e) =>
{
txt.Focus();
txt.SelectedText = Clipboard.GetText();
};
cm.Items.Add(miPaste);

if (txt.SelectedText == "")
{
miCut.IsEnabled = false;
miCopy.IsEnabled = false;
}

cm.HorizontalOffset = posX;
cm.VerticalOffset = posY;
cm.IsOpen = true;
}

// 利用例
private void TextBox1_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
e.Handled = true;
openContextMenu((TextBox)sender, e.GetPosition(owner).X, e.GetPosition(owner).Y);
}

[ posted by ken ]

この記事に対するコメント


この記事に対するコメントの投稿














管理者にだけ表示を許可する



この記事に対するトラックバック
トラックバックURL
http://comfair2.blog24.fc2.com/tb.php/481-ba74cdea
この記事にトラックバックする(FC2ブログユーザー)