かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

UWPで要素をソフトウェアキーボードに追従させる

雪猫さんのところでこんな感じのことをやってました。

[UWP] 要素をソフトウェアキーボードに追従させる | 雪猫ノート

こういう感じでUIに閉じた操作ならBehaviorのほうがいいかな?と思ったのでどんな感じなのかというのを。

using Microsoft.Xaml.Interactivity;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;

namespace App2
{
    public class InputPaneBehavior : DependencyObject, IBehavior
    {
        public DependencyObject AssociatedObject { get; private set; }

        private FrameworkElement AssociatedElement => this.AssociatedObject as FrameworkElement;

        public void Attach(DependencyObject associatedObject)
        {
            this.AssociatedObject = associatedObject;
            InputPane.GetForCurrentView().Showing += this.InputPaneBehavior_Showing;
            InputPane.GetForCurrentView().Hiding += this.InputPaneBehavior_Hiding;
        }

        public void Detach()
        {
            InputPane.GetForCurrentView().Showing -= this.InputPaneBehavior_Showing;
            InputPane.GetForCurrentView().Hiding -= this.InputPaneBehavior_Hiding;
        }

        private void InputPaneBehavior_Hiding(InputPane sender, InputPaneVisibilityEventArgs args)
        {
            this.AssociatedElement.Margin = new Thickness(0, 0, 0, sender.OccludedRect.Height);
        }

        private void InputPaneBehavior_Showing(InputPane sender, InputPaneVisibilityEventArgs args)
        {
            this.AssociatedElement.Margin = new Thickness(0, 0, 0, sender.OccludedRect.Height);
        }

    }
}

こんな感じのBehaviorを用意しておいて

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="using:App2"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:Interactivity="using:Microsoft.Xaml.Interactivity"
      xmlns:Core="using:Microsoft.Xaml.Interactions.Core"
      x:Class="App2.MainPage"
      mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <TextBox />
        <Grid Grid.Row="1">
            <Interactivity:Interaction.Behaviors>
                <local:InputPaneBehavior />
            </Interactivity:Interaction.Behaviors>
            <Button Content="OK" />
        </Grid>
    </Grid>
</Page>

こういう感じで使います。

因みに、CommandBarでいい気がするのですが、今のところCommandBarの上のボタンってソフトウェアキーボードが出てると押せなかったり押せたりと動作が不安定なんですよね…。