2015年11月30日月曜日

ボタンを押した状態の背景色を得る

SolidColorBrush br = Application.Current.Resources["SystemControlBackgroundBaseMediumLowBrush"] as SolidColorBrush;
Color col = brushButtonPush.Color;
この値は #66000000 で透明度があるので配置しているベースカラーよって変わってくる。
ボタンの他の色・ブラシは
https://msdn.microsoft.com/ja-jp/library/windows/apps/mt299109.aspx
を参照。

Controlキーが押されているかチェック

if (Window.Current.CoreWindow.GetAsyncKeyState(Windows.System.VirtualKey.Control) == CoreVirtualKeyStates.Down) {
    Debug.WriteLine("Ctrl キーダウン中");
}

ウインドウにフォーカスがあるときキー押下を取得する

KeyDown イベントハンドラを登録する
public MainPage()
{
    this.InitializeComponent();

    // KeyDown Event を登録
    Window.Current.CoreWindow.KeyDown += (_, e) => KeyDownFunc(e.VirtualKey);
}

private void KeyDownFunc(Windows.System.VirtualKey k)
{
    Debug.WriteLine("KeyDownFunc : " + k.ToString());
}

ボタン等にフォーカスがあたっている時Enterキーは取れない。
ボタンをクリックしてもそのボタンにフォーカスを移動しないようにするには
ボタンのIsTabStopプロパティをfalseにすることで実現できるようだ。

スレッドからUIコントロールを操作する

ワーカースレッドからUIコントロールを操作する方法。
WindowsForm のときは、Invokeで行っていたが、
UWPでは Dispatcher.RunAsync を使う。

例)ボタンをクリックされた時スレッドを作成してそのボタンを一瞬光らせる。

ボタンのクリックイベントで
    Task.Run(()=>ButtonFlash(button));
としてメソッドをスレッドとしてコールする。
private async void ButtonFlash(Button btn)
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
        btn.Background = new SolidColorBrush(Colors.Aqua);
    });

    // Delay は RunAsync の外で行う必要がある
    await Task.Delay(TimeSpan.FromSeconds(0.1));

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
        btn.Background = new SolidColorBrush(Colors.Gray);
    });
}