2018年09月07日(金) [長年日記]
■ [c#] WPFの読み取り専用TextBoxでカーソルを有効にする
WPFのTextBoxコントロールはReadOnlyプロパティの値をtrueにすると読み取り専用にできる。
ただ、こうするとTextBoxにカーソル(キャレット)が表示されなくなり、例えば長い行が表示された際にカーソルキーを使って右にスクロールさせるという操作ができなくなってしまう(マウスを使えば操作できるけれど)。
そういうものかと思っていたが、TextBoxにはIsReadOnlyCaretVisibleというプロパティがあることを知った。
Gets or sets a value that indicates whether a read-only text box displays a caret.
このプロパティの値をtrueにすれば、読み取り専用だがカーソルキーで操作できるTextBoxを表示できる。
2018年09月12日(水) [長年日記]
■ [c#] WPFのコンテキストメニューのイベントハンドラでターゲットのコントロールを得る
WPFにおいて、コンテキストメニューアイテムのクリックに対するイベントハンドラーにてそのコンテキストメニューが張り付いているコントロールを得る方法がなかなか分からなかったのでメモ。
コンテキストメニューのXAMLは次の通り。
<ContextMenu x:Key="contextMenu"> <MenuItem Header="メニューです" Click="OnClick"/> </ContextMenu>
OnClickイベントハンドラのシグネチャは次のようになる。
private void OnClick(object sender, RoutedEventArgs e)
OnClick()内で上のコンテキストメニューが張り付いているコントロールを得たい。senderから次のように辿れば目的のコントロールを取得できるようだ。
- senderにはMenuItemオブジェクトが設定される。
- MenuItemオブジェクトのParentプロパティにContextMenuオブジェクトが設定されている。
- ContextMenuオブジェクトのPlacementTargetプロパティにコンテキストメニューが張り付いているコントロールが設定されている。
メモしてみると当たり前なことに感じる。なかなか分からなかったのは、もっと簡単に取得できるはずだと考えたからかなあ。