Q&A
実現したいこと
TextBox内で選択したテキストに対してContextMenuを用いてテキストを変更させる機能を実装していますが、ContextMenuのMenuItemを階層化して親Itemでも子Itemでも別々の変更を適用させたいです。
前提
VisualStudio2017でWPFを用いてツールを作成していますが、TextBoxのテキストを編集する際にContextMenuを使って選択テキストに修飾させるサポート機能を追加しようとしています。その修飾機能はデフォルトの修飾とそれにオプションを付加した修飾があり、ContextMenuのMenuItemを階層化して親Itemはdefault動作を、子Itemはoption動作を割り当てたく思っています。
発生している問題
期待動作としては、ContextMenuの親Itemをクリックしたら親Item用のイベントのみ実行し、子Itemを実行したら子Item用のイベントのみを実行したいのですが、下記のソースコードで実行しても親Itemでは右クリックすることができず(クリックしても無反応)、子Itemを右クリックすると子Item用イベントを実行した後に親Item用イベントを連続して実行してしまう状態になっています。
問題を簡略化したサンプルコード
VisualStudio 2017のWPFアプリ(.NET Frameowk)のウィザードで生成されたコードをベースに課題部分を付加して実行できる形で添付します
xaml
1<Window x:Class="WpfApp1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <Grid> 10 <TextBox x:Name="textbox1" HorizontalAlignment="Left" Height="23" Margin="28,23,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"> 11 <TextBox.ContextMenu> 12 <ContextMenu> 13 <MenuItem Header="Add brackets" Click="Add_Quot"> 14 <MenuItem x:Name="menu_c1" Header="Parentheses" Click="Add_Brackets"/> 15 <MenuItem x:Name="menu_c2" Header="Braces" Click="Add_Brackets"/> 16 <MenuItem x:Name="menu_c3" Header="Brackets" Click="Add_Brackets"/> 17 </MenuItem> 18 </ContextMenu> 19 </TextBox.ContextMenu> 20 </TextBox> 21 </Grid> 22</Window>
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9using System.Windows.Documents; 10using System.Windows.Input; 11using System.Windows.Media; 12using System.Windows.Media.Imaging; 13using System.Windows.Navigation; 14using System.Windows.Shapes; 15 16namespace WpfApp1 17{ 18 /// <summary> 19 /// MainWindow.xaml の相互作用ロジック 20 /// </summary> 21 public partial class MainWindow : Window 22 { 23 public MainWindow() 24 { 25 InitializeComponent(); 26 } 27 private void Add_Quot(object sender, RoutedEventArgs e) 28 { 29 int selectedPosition = textbox1.SelectionStart; 30 int selectedEndPosition = selectedPosition + textbox1.SelectedText.Length; 31 textbox1.Text = textbox1.Text.Insert(selectedEndPosition, "\"").Insert(selectedPosition, "\""); 32 } 33 private void Add_Brackets(object sender, RoutedEventArgs e) 34 { 35 int selectedPosition = textbox1.SelectionStart; 36 int selectedEndPosition = selectedPosition + textbox1.SelectedText.Length; 37 string f = (((MenuItem)sender).Name == "menu_c1") ? "(" : (((MenuItem)sender).Name == "menu_c2") ? "{" : (((MenuItem)sender).Name == "menu_c3") ? "[" : ""; 38 string b = (((MenuItem)sender).Name == "menu_c1") ? ")" : (((MenuItem)sender).Name == "menu_c2") ? "}" : (((MenuItem)sender).Name == "menu_c3") ? "]" : ""; 39 textbox1.Text = textbox1.Text.Insert(selectedEndPosition, b).Insert(selectedPosition, f); 40 } 41 } 42}
補足情報(FW/ツールのバージョンなど)
Visual Studio 2017(Version 15.9.49)
.NET Framework Version 4.8.04084
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2023/02/24 12:12
2023/02/24 12:55 編集