/ C#, Windows 8

Windowsストアアプリのオプション設定は通常「設定チャーム」の中にあります。
Windows 8の画面右端をスライド(マウスの場合は右下or右上にカーソル移動)するとニョキっと出てくるアレがチャームで、その中の「設定」と書かれたボタンをタップすると設定チャームが開いて、アクティブになっているアプリ固有の設定などを行うことができます。

アプリは「フライアウト」と呼ばれるポップアップに各種設定項目を詰め込むわけですが、このフライアウト、以前は自前でXAMLとコードを用意しなくてはならず面倒だったのですが、VS2013では「ポップアップの設定」なるテンプレートが付属してくるようになり、少しだけラクになりました。
XAMLはともかく、設定チャームとして登録するためのコードは相変わらず必要なので、リファレンスを参考に試しに触ってみたところ、以前の形とほぼ変わらず普通に使うことができるようです。

が、以前のものも新しいテンプレもひとつ問題が…。
それは、フライアウトからファイルピッカーなどを呼び出すと、ピッカーから戻ってきた時にフライアウトが閉じてしまう、というもの。
拙作「こよみプリント」や「Simple Rec」には設定チャーム内に画像ファイルを選択するためのボタンが配置してあり、押すとファイルピッカーが開くのですが、こういった作りの場合、普通にやるとファイルピッカーが閉じた時点でチャームも閉じてしまいます。

というわけで、ちょっと力技ですが、この問題を回避する方法をば。
簡単に言うと、フライアウトが閉じたときにTagプロパティを見て何か設定されていればフライアウトを再度開くだけ、です。
以下、Windows 8.1のSettingsFlyoutを使った場合のサンプルコードです。
グダグダ書かれてますが、各々ハイライト部分に相当する記述を追加してあげればOK。
ちなみに、SettingsPaneへのイベント登録はApp.xaml.csのOnWindowCreatedをオーバーライドするのがセオリーっぽいのでご注意あれ。

public MainPage()
{
	this.InitializeComponent();

	Windows.UI.ApplicationSettings.SettingsPane.GetForCurrentView().CommandsRequested += MainPage_CommandsRequested;
}

void MainPage_CommandsRequested(Windows.UI.ApplicationSettings.SettingsPane sender, Windows.UI.ApplicationSettings.SettingsPaneCommandsRequestedEventArgs args)
{
	var settingsCommand = new Windows.UI.ApplicationSettings.SettingsCommand("Options", "Options", (_) =>
		{
			var settingFlyout = new SettingsFlyout1();

			settingFlyout.Unloaded += (s, _) =>
				{
					var flyout = (SettingsFlyout)s;
					if (flyout.Tag != null)
						flyout.Show();
				};

			settingFlyout.Show();
		});

	args.Request.ApplicationCommands.Add(settingsCommand);
}
async void OpenImage_Click(object sender, RoutedEventArgs e)
{
	try
	{
		this.Tag = "@";

		var picker = new Windows.Storage.Pickers.FileOpenPicker()
		{
			ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail,
			SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary,
		};
		picker.FileTypeFilter.Add(".png");
		picker.FileTypeFilter.Add(".jpg");
		picker.FileTypeFilter.Add(".jpeg");

		var selectedFile = await picker.PickSingleFileAsync();

		if (selectedFile != null)
		{
			//TODO - processing image

			var image = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
			var stream = await selectedFile.OpenReadAsync();
			await image.SetSourceAsync(stream);

			SelectedImage.Source = image;
		}
	}
	catch
	{
		throw;
	}
	finally
	{
		this.Tag = null;
	}
}


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です