質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1062閲覧

wpfのダブルクリック処理において、Grid.〇〇Propatyが1回目と同値であった場合のif文を作成したいです。

Okachan

総合スコア9

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

0クリップ

投稿2021/11/29 20:44

前提・実現したいこと

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

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

GetValueの使い方が間違っています。

これですとthis.GetValue(Grid.ColumnProperty)という意味になり、MainWindowGrid.Columnを取得します。
MainWindowにはGrid.Columnを付けることはないでしょうから、常に0(規定値)が返ってきます。

RectangleGetValueを呼ぶ必要があります(if内も同じ)

cs

1clPoint_x = rec.GetValue(Grid.ColumnProperty); 2clPoint_y = rec.GetValue(Grid.RowProperty);

DependencyObject.GetValue(DependencyProperty) メソッド (System.Windows) | Microsoft Docs

あるいはGrid.GetColumnGrid.GetRowで取得すると、intで返ってくるので楽です。

cs

1int clPoint_x = Grid.GetColumn(rec); 2int clPoint_y = Grid.GetRow(rec);

Grid.GetColumn(UIElement) メソッド (System.Windows.Controls) | Microsoft Docs
Grid.GetRow(UIElement) メソッド (System.Windows.Controls) | Microsoft Docs


前回ClickCountをご紹介しましたが、使えませんでしたか?(ダブルクリック判定時間が気に食わないとか?)

投稿2021/11/29 21:56

編集2023/07/29 10:31
TN8001

総合スコア9317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Okachan

2021/11/30 07:35 編集

TN8001 様 解答ありがとうございます。 無事解決できました! 最初はint型で試していたのですが、GetValue()はobject型で取得することしかできなく、object型で実装しようとしていましたが、Grid.GetRow()でint型で取れると教えていただいたのでとても助かりました。 前回教えていただいた、e.ClickCountについてですが再評価するためにTimerのセット、ClickCountのリセット(or 余を使った判定)、Widowsのようにダブルクリックの判定を変えられるような設定を作成(実装するか未定)をしたとき、現在の形のほうが使いやすいかな?と考えた次第です。 もし、そんな遠回しなことしなくてもいいのであれば変更しようと思いますが、「やるだけムダ!」みたいな処理のことについて私は考えいるのしょうか? こちらについても、よろしければご意見・感想よろしくお願いします。
TN8001

2021/11/30 10:57 編集

> Widowsのようにダブルクリックの判定を変えられるような設定を作成 そこまで考えてたのですね^^; ダブルクリック時間は個人の好みになっているはず(建前)なので、 if (e.ClickCount == 2) { Process.Start("notepad"); } だけで(特に設定などは作らずに)済ますつもりでしたw > こちらについても、よろしければご意見・感想よろしくお願いします。 ダブルクリック時間を自由に設定したいのであれば、今の実装でいいと思います^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問