前提・実現したいこと
wpfアプリでスケジュール表を作成しています。
同じセルをダブルクリックしたとき、メモ帳を開くプログラムを作成したいです。
できる限りif (clickTimer.TotalSeconds <= 0.4 && ~~ ){}
内で完結したいです。
プログラムをは結構省いているので足りない部分があれば修正依頼をください。
発生している問題・エラーメッセージ
同じセルをダブルクリックしたときの処理を行おうとしましたがうまくいきません。
具体的には、mouseleftbuttondown内で一回目クリックしたときのProperty値を変数に入れ2回目以降は過去の値とGetValue()が一致しているのと0.4秒以内に2回目のクリックされた場合のみメモ帳を開くプログラムを書いたつもりでしたが、0.4秒以内に一度目とは違うセルをクリックしてもメモ帳が開いてしまいます。
該当のソースコード
XAML
1 2 <Grid> 3 <Grid.RowDefinitions> 4 <RowDefinition Height="40*"/> 5 <RowDefinition Height="380*"/> 6 </Grid.RowDefinitions> 7 <GroupBox x:Name="CalendarGroup1" Header="" Margin="10,10,10,10" Grid.Row="1"> 8 <Grid x:Name="CalenderGrid01"> 9 <Grid.ColumnDefinitions> 10 <ColumnDefinition Width="1*"/> 11 <ColumnDefinition Width="1*"/> 12 <ColumnDefinition Width="1*"/> 13 <ColumnDefinition Width="1*"/> 14 <ColumnDefinition Width="1*"/> 15 <ColumnDefinition Width="1*"/> 16 <ColumnDefinition Width="1*"/> 17 </Grid.ColumnDefinitions> 18 <Grid.RowDefinitions> 19 <RowDefinition Height="20"/> 20 <RowDefinition Height="15"/> 21 <RowDefinition Height="1*"/> 22 <RowDefinition Height="15"/> 23 <RowDefinition Height="1*"/> 24 <RowDefinition Height="15"/> 25 <RowDefinition Height="1*"/> 26 <RowDefinition Height="15"/> 27 <RowDefinition Height="1*"/> 28 <RowDefinition Height="15"/> 29 <RowDefinition Height="1*"/> 30 <RowDefinition Height="15"/> 31 <RowDefinition Height="1*"/> 32 </Grid.RowDefinitions> 33 </Grid>
C#
1 /// <summary> 2 /// MainWindow.xaml の相互作用ロジック 3 /// </summary> 4 public partial class MainWindow : Window 5 { 6 /// <param name="rectClick">シングルクリック</param> 7 /// <param name="firstClick">最初にクリックした時間</param> 8 /// <param name="lastClick">最後にクリックした時間</param> 9 /// <param name="clickTimer">クリック判定用時間</param> 10 /// <param name="clPoint_x">クリックした位置の記録(Column)</param> 11 /// <param name="clPoint_y">クリックした位置の記録(Row)</param> 12 private Rectangle rectClick; 13 private static DateTime firstClick; 14 private static DateTime lastClick; 15 private static TimeSpan clickTimer; 16 private static object clPoint_x; 17 private static object clPoint_y; 18 19 /// <summary> 20 /// MainWindow 21 /// </summary> 22 public MainWindow() 23 { 24 InitializeComponent(); 25 } 26 27 /// <summary> 28 /// セル(日)をクリックした際のイベントハンドラ. 29 /// </summary> 30 /// <param name="sender"></param> 31 /// <param name="e"></param> 32 private void date_mouseleftbuttondown(object sender, MouseButtonEventArgs e) 33 { 34 //既に選択されたセルがある場合は初期化 35 if (rectClick != null) 36 { 37 lastClick = DateTime.Now; 38 clickTimer = lastClick - firstClick; 39 if (clickTimer.TotalSeconds <= 0.4 && clPoint_x == GetValue(Grid.ColumnProperty) && clPoint_y == GetValue(Grid.RowProperty)) 40 { 41 //(仮組)0.4s以下でダブルクリック判定.メモ帳を開くプログラムを書く.(動作したら未実装部分を埋める or new windowの作成をする) 42 System.Diagnostics.Process.Start("notepad", @"C:\WINDOWS\system32\notepad.exe"); 43 44 } 45 rectClick.StrokeDashArray = null; 46 rectClick.StrokeThickness = 0; 47 } 48 49 //枠線に点線セット 50 Rectangle rec = sender as Rectangle; 51 rec.Stroke = Brushes.Black; 52 DoubleCollection dbc = new DoubleCollection(); 53 dbc.Add(1); 54 rec.StrokeDashArray = dbc; 55 rec.StrokeThickness = 1; 56 57 //選択セルの保持 58 rectClick = rec; 59 firstClick = DateTime.Now; 60 61 //ここで選択したセルの位置を記憶 62 clPoint_x = GetValue(Grid.ColumnProperty); 63 clPoint_y = GetValue(Grid.RowProperty); 64 }
試したこと
Grid.ColumnPropertyとGrid.RowPropertyを最後に取得することで、if文内で過去に取得した値が格納された変数==GetValue()でできると考え実行しました。
補足情報(FW/ツールのバージョンなど)
Windows10
Visual Studio 2019 16.2.5
WPFアプリ
.NET Framework 4.7.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/30 07:35 編集
2021/11/30 10:57 編集