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

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

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

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

2回答

647閲覧

Xamarin.UWPでキーボード操作を実装する方法

neptaco

総合スコア6

UWP

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

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2017/08/28 18:13

編集2017/08/29 02:02

###Xamarin.UWPでウィンドウ全体に対するキーボード操作を行いたいです。
Xamarinを使用し、UWPのデスクトップアプリを作成しようとしています。

デスクトップのメーラーやRSSリーダーのように、左にリストがあり右に詳細画面がある形を想定しています。
この画面上で j,k などのキーを押下することで左のリストの選択アイテムを移動し詳細画面の切り替えを行いたいと考えています。

このとき、Xamarin.UWP 上にてキーボード操作を実現する方法がわからないためご教示願います。

###発生している問題・エラーメッセージ

下記のページを参考に実装をしてみましたが、Controlがnullのままになってしまい動作しません。
How can i detect key events in xamarin.forms?

###該当のソースコード

C#:CustomPageRenderer

1[assembly: ExportRenderer(typeof(CustomPage), typeof(CustomPageRenderer))] 2namespace ShortcutTest.UWP { 3 public class CustomPageRenderer : PageRenderer 4 { 5 protected override void OnElementChanged(ElementChangedEventArgs<Page> e) 6 { 7 base.OnElementChanged(e); 8 9 // ここがnullになっており下の処理にいかない 10 if (Control == null) 11 return; 12 13 if (e.OldElement != null) 14 { 15 Control.KeyDown -= Control_KeyDown; 16 } 17 18 if (e.NewElement != null) 19 { 20 Control.KeyDown += Control_KeyDown; 21 } 22 } 23 } 24}

###試したこと
Pageに対してEffectを設定して、Control.KeyDownも設定してみましたが動作しませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)

  • Visual Studio 2017 (15.3.1)
  • Xamarin.Forms 2.3.5.256-pre6
  • Windows 10

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

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

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

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

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

guest

回答2

0

かなり前の質問のようですが、自分が実装している方法を記述しておきます。

C#

1class MyPageRenderer : PageRenderer 2{ 3 MyPage myPage = null; 4 5 protected override void OnElementChanged(ElementChangedEventArgs<Page> e) 6 { 7 base.OnElementChanged(e); 8 9 if (e.OldElement != null) 10 { 11 myPage = null; 12 Unloaded -= ImageViewRenderer_Unloaded; 13 Loaded -= ImageViewRenderer_Loaded; 14 } 15 16 if (e.NewElement != null) 17 { 18 myPage = (MyPage)e.NewElement; 19 Unloaded += ImageViewRenderer_Unloaded; 20 Loaded += ImageViewRenderer_Loaded; 21 } 22 23 } 24 25 private void ImageViewRenderer_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) 26 { 27 Dispatcher.AcceleratorKeyActivated += Dispatcher_AcceleratorKeyActivated; 28 } 29 30 private void ImageViewRenderer_Unloaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) 31 { 32 Dispatcher.AcceleratorKeyActivated -= Dispatcher_AcceleratorKeyActivated; 33 } 34 35 private void Dispatcher_AcceleratorKeyActivated(Windows.UI.Core.CoreDispatcher sender, Windows.UI.Core.AcceleratorKeyEventArgs args) 36 { 37 if (args.EventType == Windows.UI.Core.CoreAcceleratorKeyEventType.KeyDown) 38 { 39 if (myPage != null) 40 { 41 var strKey = args.VirtualKey.ToString(); 42 43 switch (strKey) 44 { 45 case "186": 46 strKey = "Colon"; 47 break; 48 case "187": 49 strKey = "SemiColon"; 50 break; 51 case "188": 52 strKey = "Comma"; 53 break; 54 case "190": 55 strKey = "Piriod"; 56 break; 57 case "191": 58 strKey = "/"; 59 break; 60 case "192": 61 strKey = "@"; 62 break; 63 case "219": 64 strKey = "["; 65 break; 66 case "220": 67 strKey = "\"; 68 break; 69 case "221": 70 strKey = "]"; 71 break; 72 } 73 myPage.OnKeyDown(strKey); 74 } 75 } 76 } 77}

c#

1public partial class MyPage : ContentPage 2{ 3 public void OnKeyDown(String key) 4 { 5 switch(key) 6 { 7 case "A": 8 // Aを入力した時の処理 9 break; 10 case "B": 11 // Bを入力した時の処理 12 break; 13 } 14 } 15}

投稿2019/06/26 00:42

Velmy

総合スコア17

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

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

0

Control ではなく ContainerElement を使うと、他の部分はそのままで、うまくいくのではないでしょうか。

投稿2017/09/23 21:33

NakamuraYoichi

総合スコア374

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問