キーボードショートカットを付ける

公式の方法 UWPの公式キーボードショートカットの方法はGridのKeyDownイベントをとってねという感じです。 なにやらAutomationPropertiesとかの方法もあるらしいですがよくわからないです。 Gridが(理想のタイミングで)フォーカスを受け取れない 受け取れないわけではないですが、例えばGridをクリックしてもGridのGotFocusイベントは発生しません。 Gridの子要素にTextBoxなど、フォーカスが当たるものにフォーカスがあったとき、GridのGotFocusイベントが発生します。 Gridにフォーカスが当たってないとKeyDownイベントが発生しないのですが子要素のTextBoxにフォーカスがあたってるときにショートカット発動してもうれしくないし誤動作の原因になります。 Dispatcher.AcceleratorKeyActivatedイベントを使う Dispatcher.AcceleratorKeyActivatedイベントを使うと、現在のDispatcher内で押されたキーをすべて検知することができます。 しかしこれ単体で動かすと、例えばショートカットを適用したいGridからフォーカスがはずれて、別のページに行ったときもショートカットが発動してしまいます。 つまりDispatcher.AcceleratorKeyActivatedイベントでキーを検知したとき、Gridに(理想的な)フォーカスが当たっていればショートカットを発動すればよいわけです。 Gridのショートカットキー的に理想なフォーカスイベント ではGridの理想的なフォーカスイベントとは何かというと調べた感じたぶんこれぐらいだとおもいます。 PointerPressedはGridをクリックしたときに発動するので理想的なフォーカスといえます。 Unloadedはもし別のページに遷移した、現在のXAMLページが破棄されるなどのときに必要になります。 GotFocusイベントは引数のOriginalSourceを見て、もしGridならフォーカスを、もしGridじゃない(例えば子要素のTextBoxなど)ならフォーカスをあてないことによってテキストボックス入力中にショートカットが発動することを防ぎます。 ビヘイビアを使う いちいちGridのイベントをとっていてはめんどくさいので自作ビヘイビアを作って簡単にしましょう。 ビヘイビアを自作するためにはBehaviorSDKを参照する必要があります。 作ったビヘイビアがこちらになります。コピペすれば使えます。 using Microsoft.Xaml.Interactivity; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input; using Windows.System; using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Markup; using Windows.UI.Xaml.Media; namespace Behaviors { public class PressedKeyList {…

IBehaviorを実装するときはActionsプロパティに気を付ける

3時間ぐらい悩みました。 IBehaviorを実装するときにActionCollectionを返すActionsプロパティを公開するのですがこんな感じで デフォルトの値をnew ActionCollectionにしてると ActionCollectionにいれた例えばInvokeCommandActionなどにDataContextが伝播されず、Commandがnullになってしまいます。 めちゃくちゃ悩んでたんですけど、なにやら公式のBehavior SDKはオープンソースだったらしく、公式のソースを見ました。 どうやらActionsプロパティのデフォルトはnull Actionsプロパティをgetterのみとし、getterでインスタンスを作成しているようです。 これでDataContextも伝播されます。 ちなみにActionsのアクション実行方法はInteractivityクラスをつかいます。

XAMLでArchを書く

ArchSegment XAMLにはデフォルトでArchや円グラフのような、円の端が切れていてその端の長さを自由に選択できるような図形がありません。 そこでXAMLにはArchSegmentというPathのFigure内にArchを書く要素が存在します。 がArchSegmentは始点と終点を絶対座標で指定し、しかもその座標間が短いかどうかでも描画されるArchが変化し、非常に使いづらいです。 標準の使い方はこちらにのっています。   ではどうすれば角度を指定して、その通りに円の端が切れるようなArchが書けるのかというと、ArchSegmentの終点の座標を三角関数で導く必要があります。 というわけでそういうユーザーコントロールを用意しました。以下をコピーしていただければ使えると思います。 RateProgressRing.xaml <UserControl x:Class=”WordShuffle.Controls.RateProgressRing” xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” xmlns:local=”using:Controls” xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″ xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″ mc:Ignorable=”d” d:DesignHeight=”300″ d:DesignWidth=”300″ Loaded=”UserControl_Loaded”> <UserControl.Resources> <Storyboard x:Name=”ValueChangeAnimation”/> </UserControl.Resources> <Grid> <Ellipse x:Name=”ellipse_back” StrokeThickness=”0″ /> <Canvas x:Name=”canvas” > <Path x:Name=”path” Stroke=”{StaticResource ApplicationThemeBrush}” StrokeThickness=”10″> <Path.Data> <PathGeometry x:Name=”pathGeometory”> <PathGeometry.Figures> <PathFigure x:Name=”pathFigure”> <ArcSegment x:Name=”archSegment” /> </PathFigure> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path> </Canvas> </Grid> </UserControl> RateProgressRing.xaml.cs…

WebViewのユーザーエージェントを変更してスマホ用サイトを表示する

NavigateWithHttpRequestMessage XAML WebViewのユーザーエージェント変更はで紹介されていますが(おそらく)UWPからWebViewにNavigateWithHttpRequestMessageというメソッドができました。 これでのおかげでHttpRequestMessageを指定でき、HttpヘッダーもいじったリクエストをWebViewで表示できます。 以下のエージェントはMADOSMAのEdgeで開いた時と同じエージェントになります。 var requestMessage = new HttpRequestMessage(); requestMessage.RequestUri = new Uri(url); requestMessage.Headers.Add(“user-agent”, “Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; MCJ; MouseComputer MADOSMA Q501) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586”); this.webView_flyout.NavigateWithHttpRequestMessage(requestMessage);   Fortunately, according to do this possibility, your present you can select the requirements and easier and interest in contact the…

Cortanaからアプリをバックグラウンド起動する – VoiceCommandServiceConnection

Cortanaからアプリの操作 UWPではCortanaに事前に音声コマンド定義ファイル(VoiceCommandDefinition)を登録しておくことによってCortanaに特定の言葉を発話させたときにアプリを起動させることができます。 CortanaからUWP起動はフォアグラウンド起動とバックグラウンド起動の2つのパターンがありますが今回はバックグラウンド起動のパターンです。 バックグラウンド起動の場合、アプリはAppServiceという仕組みを通してバックグラウンド起動し、特定の言葉をCortanaにしゃべらせることができます。 VoiceCommandDefinitionファイルを作る VoiceCommandDefinitionファイルはここ https://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/dn706593.aspx の定義に従って作ります。 CommandSet – 言語(ja-JP)単位で作ります。多言語対応する場合は複数作成 CommandPrefix – 認識したい言葉の前に必ずつけます Example – 発話例 Command – 認識したいコマンドを定義。複数定義可 Example – 発話例 ListenFor – 認識したいコマンドを書きます。[]であってもなくてもよい、{}はPhraseListの中から選択することになります Feedback – 認識完了したときCortanaに言わせる言葉 VoiceCommandService– 起動したいアプリのAppServiceを指定します。 <?xml version=”1.0″ encoding=”utf-8″ ?> <VoiceCommands xmlns=”http://schemas.microsoft.com/voicecommands/1.2″> <CommandSet xml:lang=”ja-JP”> <CommandPrefix>サンプル</CommandPrefix> <Example>サンプル バックグラウンド起動</Example> <Command Name=”Command1″> <Example>サンプル バックグラウンド起動</Example> <ListenFor>バックグラウンド[起動]{number}</ListenFor> <Feedback>認識しました</Feedback> <VoiceCommandService Target=”VoiceAppService” /> </Command> <PhraseList Label=”number”> <Item> 1 </Item>…