記事一覧画面にアプリバーとPinButtonコントロールを追加する
「FeedPage.xaml」ファイルに、次のようにXAMLコードを追記するだけである。
<Page
x:Name="pageRoot"
x:Class="AtmarkItReader.FeedPage"
……省略……
d:DataContext="{Binding Feeds[0], Source={d:DesignData Source=/SampleData/FeedsDataSample.json, Type=dm:FeedsData}}"
xmlns:tl="using:AtmarkItReader.Tile"
>
<!-- 【第9回】xmlns:tlを追加 -->
<Page.Resources>
……省略……
</Page.Resources>
<!-- 【第9回】アプリバーと「ピン留め」ボタンを追加 -->
<Page.BottomAppBar>
<CommandBar Background="#00a2e8" >
<CommandBar.PrimaryCommands>
<tl:PinButton />
</CommandBar.PrimaryCommands>
</CommandBar>
</Page.BottomAppBar>
……省略……
これで実行すると、記事一覧画面でアプリバーを出せて、その右端には[ピン留めする]ボタンが表示されるはずだ。ただし、このボタンをタップしても何も起こらない。次に[ピン留めする]ボタンをタップしたときの処理を実装しよう。
セカンダリタイルを登録/解除するコード
PinButtonコントロールに戻って、セカンダリタイルを登録/解除するコードを実装しよう。
まず、イベントを受けて処理本体を呼び出す部分から(次のコード)。
protected override void OnKeyUp(Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
{
base.OnKeyUp(e);
// スペースキーかエンターキーを押されたときは処理本体を呼び出す(Clickイベントの代わり)
if (e.Key == Windows.System.VirtualKey.Space || e.Key == Windows.System.VirtualKey.Enter)
ProcessPin();
}
protected override void OnTapped(Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
base.OnTapped(e);
// マウスクリックか指でタップされたときは処理本体を呼び出す(Tappedイベント)
ProcessPin();
}
private async void ProcessPin()
{
// フラグを見て呼び出す処理本体を振り分ける
if (!_isUnPin)
await CreateSecondaryTileAsync();
else
await RemoveSecondaryTileAsync();
}
「ピン留めする」ためのCreateSecondaryTileAsyncメソッドは、次のようになる。
private async System.Threading.Tasks.Task CreateSecondaryTileAsync()
{
FixAppBar(); // このメソッドについては後述
// セカンダリタイルのオブジェクトを作る
var secondaryTile = new Windows.UI.StartScreen.SecondaryTile()
{
TileId = this.TileId, // 【必須】タイルを識別するID。削除時にも使う
DisplayName = this.DisplayName, // 【必須】タイルの左下に表示するテキスト
Arguments = this.Arguments, // セカンダリタイルからの起動時に渡される引数
RoamingEnabled = true, // 既定でtrue(=ローミングされる)
};
// 背景色や画像などの設定
secondaryTile.VisualElements.BackgroundColor = Windows.UI.Color.FromArgb(0x00,0x92,0xd0,0x50); // 背景色を緑色に
secondaryTile.VisualElements.ForegroundText = Windows.UI.StartScreen.ForegroundText.Light; // 表示するテキストの色
secondaryTile.VisualElements.ShowNameOnSquare150x150Logo = true; // 中タイルにテキストを表示する
secondaryTile.VisualElements.ShowNameOnWide310x150Logo = true; // ワイドタイルにテキストを表示する
secondaryTile.VisualElements.ShowNameOnSquare310x310Logo = true; // 大タイルにテキストを表示する
secondaryTile.VisualElements.Square70x70Logo = new Uri("ms-appx:///Assets/MiniLogo.png"); // 小タイルの画像
secondaryTile.VisualElements.Square150x150Logo = new Uri("ms-appx:///Assets/Logo2nd.png"); // 【必須】中タイルの画像
secondaryTile.VisualElements.Wide310x150Logo = new Uri("ms-appx:///Assets/WideLogo.png"); // ワイドタイルの画像
secondaryTile.VisualElements.Square310x310Logo = new Uri("ms-appx:///Assets/LargeLogo.png"); // 大タイルの画像
// エンドユーザーにピン留めの許可を求めるリクエストを発行する
var success = await secondaryTile.RequestCreateForSelectionAsync(
GetElementRect(this), // このメソッドについては後述
Windows.UI.Popups.Placement.Below
);
if (success)
{
// ピン留めできたので、表示を切り替える
_isUnPin = true;
base.Icon = _unPinIcon;
base.Label = _unPinLabel;
}
FreeAppBar(); // このメソッドについては後述
}
上のコードに出てきたFixAppBar/GetElementRect/FreeAppBarの3つのヘルパーメソッドのコードは次のようなものだ。
// GetElementRect:UIコントロールの表示位置を取得するメソッド
public static Windows.Foundation.Rect GetElementRect(Windows.UI.Xaml.FrameworkElement element)
{
Windows.UI.Xaml.Media.GeneralTransform buttonTransform
= element.TransformToVisual(null);
Windows.Foundation.Point point
= buttonTransform.TransformPoint(new Windows.Foundation.Point());
return new Windows.Foundation.Rect(
point,
new Windows.Foundation.Size(element.ActualWidth, element.ActualHeight)
);
}
// FixAppBar:下側のアプリバーを開いたままにする
private void FixAppBar()
{
var appBar = GetBottomAppBar();
if (appBar != null)
appBar.IsSticky = true;
}
// FreeAppBar:下側のアプリバーを閉じられるようにする
private void FreeAppBar()
{
var appBar = GetBottomAppBar();
if (appBar != null)
appBar.IsSticky = false;
}
private AppBar GetBottomAppBar()
{
var f = Windows.UI.Xaml.Window.Current.Content as Frame;
if (f == null)
return null;
var p = f.Content as Page;
if (p == null)
return null;
return p.BottomAppBar;
}
最後に、「ピン留め解除」のためのRemoveSecondaryTileAsyncメソッドは、次のようになる。
private async Task RemoveSecondaryTileAsync()
{
FixAppBar();
// セカンダリタイルのオブジェクトを作る(解除時はTileIdの指定だけでよい)
var secondaryTile
= new Windows.UI.StartScreen.SecondaryTile(this.TileId);
// エンドユーザーにピン留め解除の許可を求めるリクエストを発行する
bool success
= await secondaryTile.RequestDeleteForSelectionAsync(
GetElementRect(this), Windows.UI.Popups.Placement.Above);
if (success)
{
// ピン留め解除できたので、表示を切り替える
_isUnPin = false;
base.Icon = _pinIcon;
base.Label = _pinLabel;
}
FreeAppBar();
}
これで、記事一覧画面のアプリバーの[ピン留めする]ボタンが機能するようになったはずだ。
実行してボタンをタップすると、ピン留めの許可を求めるフライアウトが出てくる(次の画像)。ここでタイルサイズを選び、必要ならタイルに表示されるテキストを編集してから、[スタート画面にピン留めする]ボタンをタップすると、スタート画面にセカンダリタイルが表示される。
スタート画面にセカンダリタイルが表示された状態では、ボタンが[ピン留め解除]に切り替わっている。タップすると、ピン留め解除の許可を求めるフライアウトが出てくる(次の画像)。
Copyright© Digital Advantage Corp. All Rights Reserved.