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

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

新規登録して質問してみよう
ただいま回答率
85.47%
UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

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

Q&A

解決済

2回答

1413閲覧

UWPのタイマーを使用したCanvasオブジェクトの操作につきまして。

oldstance

総合スコア11

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

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

0グッド

0クリップ

投稿2021/05/06 03:41

お世話になります。

UWPのタイマーハンドラー内において、Canvasへの操作を行うと例外を吐いてしまいます。

Visual Studio 2019 Communitynにて空白のアプリ(ユニバーサルWindows)のプロジェクトを作成、フォームにCanvasを貼り付け(名前をcanvas1とします)、以下のコードを実行します。

csharp

1using System; 2using System.Timers; 3using System.Windows; 4using System.Windows.Controls; 5using System.Windows.Shapes; 6using System.IO; 7using System.Timers; 8 9namespace test 10{ 11 public partial class MainWindow : Window 12 { 13 Rectangle rect = null; 14 int height = 0; 15 Timer timer = null; 16 17 public MainWindow() 18 { 19 InitializeComponent(); 20 21 rect = new Rectangle(); 22 rect.Width = 100; 23 rect.Height = 10; 24 rect.Fill = Brushes.Green; 25 canvas1.Children.Add(rect); 26 27 timer = new Timer(); 28 timer.Interval = 1000; 29 timer.Elapsed += new ElapsedEventHandler(TimerHandler); 30 timer.Start(); 31 } 32 33 public void TimerHandler(object sender, ElapsedEventArgs e) 34 { 35 Canvas.SetLeft(rect, 0); // ここで例外が発生 36 Canvas.SetTop(rect, height); 37 ++height; 38 } 39 } 40}

1秒間隔で緑の矩形が下にずれていくのを想定しているのですが、タイマーハンドラ内ではCanvasへのアクセスは禁じられているのでしょうか。

一定間隔でCanvasへ追加したオブジェクトの座標などを操作したいのですが、UWPではどの様に行うのが常識なのでしょうか。

以上、宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

一般的に、UIコンポーネントの表示に関わる操作というのは、UIスレッドと同一スレッドでないと操作できません

おそらく、あなたのお使いのTimerでのタイマイベントは別スレッドで実行されているため、UIコンポーネントの操作でコケてるんでしょう。

一番かんたんな解決策は、タイマイベントが同一スレッドで実行されるようなタイマを使う、ってことでしょう

タイマにより一定時間間隔で処理を行うには?(WPFタイマ編):.NET TIPS - @IT

投稿2021/05/06 04:22

y_waiwai

総合スコア87784

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

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

0

自己解決

表題の件ですが、自己解決しました。

System.Timersを使うのではなく、System.Windows.ThreadingのDispatcherTimerを使うことによりタイマーハンドラー内でもCanvasの操作を行うことができました。

お騒がせいたしましたm(__)m

投稿2021/05/06 04:16

oldstance

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問