以前、MetroStyleApp入門 vol45.setting flyoutをC#で実装するでsetting flyoutコントロールがC#ではデフォルトで存在しないことを書きました。
その時はRTMのWindows 8では追加されているだろうと期待したのですが、残念ながら追加されませんでした。
というわけで、実装方法。
ゴリゴリ書くかライブラリか迷いましたがRTMに対応したライブラリがあるのでこれを使うことにします。
以前紹介したCharmFlyoutがNuGetからDL可能になりました。
複数のPageから設定チャームを利用する方法はCharmFrame – Adding CharmFlyout to Grid Appsを参考にします。
「プロジェクト」→「NuGetパッケージの管理」でダイアログを起動。
「Charm」で検索。
CharmFlyoutをインストール。
参照に追加されました。
Flyout用のUserControlを作成します。
ソリューションエクスプローラーから右クリックで「追加」→「新しい項目」
ユーザーコントロールを追加します。
今回はSettingFlayoutというコントロール名で作成しました。
ユーザーコントロールにチャーム用の設定を記載。
SettingFlayout.xaml.cs
using System; using System.Collections.Generic; using System.IO; using System.Linq; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.ApplicationSettings; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // ユーザー コントロールのアイテム テンプレートについては、http://go.microsoft.com/fwlink/?LinkId=234236 を参照してください namespace CharmSample { public sealed partial class SettingFlyout : UserControl { public SettingFlyout() { this.InitializeComponent(); SettingsPane.GetForCurrentView().CommandsRequested += CommandsRequested; } private void CommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args) { args.Request.ApplicationCommands.Add(new SettingsCommand("id", "どこからでも設定", (p) => { settingFlyout.IsOpen = true; })); } } }
SettingFlayout.xamlに記載
<UserControl x:Class="CharmSample.SettingFlyout" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:CharmSample" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:flyout="using:CharmFlyoutLibrary" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid> <flyout:CharmFlyout x:Name="settingFlyout" Heading="どこからでも設定" HeadingBackgroundBrush="#FF7676E2"> <StackPanel> <Button Height="36" Width="200" Content="設定"/> </StackPanel> </flyout:CharmFlyout> </Grid> </UserControl>
これで呼び出される側のFlayoutは完成です。
では呼び出す側の仕組みはどうなっているか?
これ色々な処理の参考になる気がするんですが、Frameクラスを拡張しています。
(ライブラリがみんなこれやると困るか・・・)
App.xaml.csのrootFrame = new Frame();行を以下のように修正。
/// <summary> /// アプリケーションがエンド ユーザーによって正常に起動されたときに呼び出されます。他のエントリ ポイントは、 /// アプリケーションが特定のファイルを開くために呼び出されたときに /// 検索結果やその他の情報を表示するために使用されます。 /// </summary> /// <param name="args">起動要求とプロセスの詳細を表示します。</param> protected override void OnLaunched(LaunchActivatedEventArgs args) { Frame rootFrame = Window.Current.Content as Frame; // ウィンドウに既にコンテンツが表示されている場合は、アプリケーションの初期化を繰り返さずに、 // ウィンドウがアクティブであることだけを確認してください if (rootFrame == null) { // ナビゲーション コンテキストとして動作するフレームを作成し、最初のページに移動します rootFrame = new CharmFrame { CharmContent = new SettingFlyout() };
ページに依存しない形で呼び出すことができました。
Please give us your valuable comment