2018年4月8日日曜日

MoveFocusはCtrlキーと併用できない

WPFのコントロール間のフォーカス移動にMpoveFocus()を使っていたのですが、うまく動かないケースがあります。

このような画面で、以下のような画面を作成します。
タブAのボタンにはMoveFocusでフォーカス移動するようにしてあります。




private void Button_Click(object sender, RoutedEventArgs e)
{
 var ctl = Keyboard.FocusedElement as UIElement;
 if (ctl != null)
 {
  ctl.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
 }
}

これを普通に実行しても、何もおきません。

でも、Ctrlキーを押しながらボタンをクリックすると・・・

タブBに切り替わった!!

どうやら、TabControlは、Ctrl+Tabでタブの切り替えが発生するようです。
もしかして、MoveFocusメソッドで指定しているFocusNavigationDirection.NextがTabキーとして認識されている・・・?

この現象、フォーカスの移動先がTextBoxなどの場合は発生しなかったりなのですが、
もし、MoveFocusを使用することで予期しない動作をする場合は、確認していたほうがいいかも?

処理がメインスレッドで実行されているか判定する(CheckAccess)

画面に関する処理などはメインスレッドで実施する必要があります。
処理によっては、メインスレッドで実施されているかどうか判定が必要となります。

メインスレッドかどうかの判定には
Application.Current.Dispatcher.CheckAccess()
を使用します。
CheckAccess()はメインスレッドの場合にTrueを返します。


using System.Windows;

private void Execute()
{
 // メインスレッドから実行
 bool checkAccessA = Application.Current.Dispatcher.CheckAccess();

 Debug.WriteLine("メインスレッド [" + checkAccessA + "]");

 // タスク内で実行
 Task.Run(() =>
 {
  bool checkAccessB = Application.Current.Dispatcher.CheckAccess();

  Debug.WriteLine("別スレッド [" + checkAccessB + "]");
 });
}


このプログラムの実行結果は

メインスレッド [True]
別スレッド [False]

のようになります。

WPFでLivetを使用しているなら、
DispatcherHelper.UIDispatcherを使用できるので、あまり出番はないかもしれませんが・・・

2018年4月2日月曜日

Scratchでプログラミング その26 円を描く

Scratchの使い方解説です、今回の難易度は超Easy
スクラッチアートのツールの色が綺麗だったのですが、絵心が無いのでプログラムで綺麗な円を書いてみようと思います。


ペンツールを使って円を描いてみます。




Scratchで円を描くにはペンツールを使用するので、三平方の定理を利用してみました。

なんかこんなのを高校の数学で習った気がします。


この式を、yを求める式にしたものは以下のようになります。


この数式を利用して、x座標を少しずつ変えながら、y座標の値を求めていき、
その座標をつなげることで、円を描きます。

スクラッチでy座標を求める式を表現するとこんな感じです。

式中の「r」は半径のことです。
この式のdxを少しずつ動かすことで、dyを計算します。

これは、半径rの円について、座標を計算するためのプログラムです。

dxには半径分の座標を細かく分けた座標が指定されます。
プログラム中の「細かさ」の数値が大きくなるほど、円が綺麗に描かれることになります。




上記の式は、実際には円の4分の1しか描画されません。


さきほどの計算で取得できる座標は常に正の数です。
x座標、y座標が両方とも正の数なので、円の右上の4分の1の座標を計算するための式になっています。

実際にはy座標が負の数値の座標の取得も必要になります。
x座標についても、同様にマイナス側の座標の計算が必要です。
そのため、円の作成には、4パターンの座標をつなげました。



今回のサンプルでは関数も使用しています。
そちらも今度記事にすると思いますが、今回はここまで。

サンプル010 円を描く
https://scratch.mit.edu/projects/213084309/