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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

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

Q&A

1回答

2678閲覧

WPF(C#)で、controlのIsFocused+Timer threadからのアクセスについて教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

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

0グッド

0クリップ

投稿2016/01/13 04:55

いつも大変お世話になります。
WPF(C#)で、controlのIsFocusedについて教えてください。

Windows7 Pro, Visual Studio 2013 Expressの組み合わせで、WPFアプリケーションを作っています。

stackPanel/textboxにフォーカスがある時という条件でif文を組みたいと思っております。

C# Formの場合は
if(dataGridView.Focused) {
// 処理
}

なので、
WPF(C# code)
if (stackPanel.IsFocused)
//処理
else if (textBox.IsFocused)
//処理
のような条件を立ててみました。

System.Timer.Timer timer = new System.Timer.Timer();
private void setting() {
timer.Interval = 500;
timer.Enabled = true;
timer.Start();
timer.Elapsed+=timer_Elapsed;
}

void softwarewatchtimer_Elapsed(object sender, ElapsedEventArgs e) {
if (stackPanel.IsFocused)
//処理
else if (textBox.IsFocused)
//処理

}
とタイマーで実行すると別threadからUIにアクセスすることになり、System.InvalidOperationExceptionの例外となります。

どう回避たらよいか、ご示唆ください。

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

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

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

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

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

guest

回答1

0

こんにちは

リンク先のmsdnの解説をご覧ください。
DispatcherTimer クラス

投稿2016/01/13 05:07

daichan

総合スコア225

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

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

退会済みユーザー

退会済みユーザー

2016/01/13 06:05

こんにちは。 すみません。msdn、読みきれませんでした。
daichan

2016/01/13 06:35

ここです。 > System.Timers.Timer が WPF アプリケーションで使用される場合は、System.Timers.Timer はuser interface (UI) スレッドとは別のスレッドで実行されることに注意します。user interface (UI) スレッドでオブジェクトにアクセスするには、Invoke または BeginInvoke を使用して、user interface (UI) スレッドの Dispatcher に操作をポストする必要があります。 System.Timers.Timer ではなく DispatcherTimer を使用する理由は、DispatcherTimer は Dispatcher と同じスレッドで実行されることと、DispatcherTimer には DispatcherPriority を設定できることです。
daichan

2016/01/13 06:49

System.Timers.TimerをやめてDispatcherTimerに置き換えるか、 System.Timers.Timerを使う場合は、以下のような感じに書き換える必要があります。 void softwarewatchtimer_Elapsed(object sender, ElapsedEventArgs e) { this.Dispatcher.Invoke(new Action(()=> { if (stackPanel.IsFocused) //処理 else if (textBox.IsFocused) //処理 })); }
退会済みユーザー

退会済みユーザー

2016/01/13 08:51

ありがとうございます。 このActionの中身はどこに書けばよいのでしょう?
daichan

2016/01/13 09:24

? void softwarewatchtimer_Elapsed(object sender, ElapsedEventArgs e) { if (stackPanel.IsFocused) //処理 else if (textBox.IsFocused) //処理 } ↓このように変更する void softwarewatchtimer_Elapsed(object sender, ElapsedEventArgs e) { this.Dispatcher.Invoke(new Action(()=> { if (stackPanel.IsFocused) //処理 else if (textBox.IsFocused) //処理 })); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問