昨日までの Flyout の続きで Popup を使ってみます。
Windows のストアアプリは 8 の頃の Popup から 8.1 の Flyout のような感じで進んできたらしいのですが、8.1 から WinRT に対応した Phone にとってはどちらも同様に新機能みたいなものですね。
(追記) すみません、普通に Phone 7 からありました。
Popup コントロールを配置する
Blend を開いてアセットの中から Popup を適当な場所にドラッグ & ドロップします。
<Popup> ~ </Popup> の間に普通にコントロールを置いていきます。
Popup を開くためのボタンとあわせてこんな感じで作ってみました。
コードから Popup を開くために MyPopup という名前をつけている事と、HorizontalOffset, VerticalOffset で位置を調整している程度でしょうか。
<Grid Grid.Row="1" x:Name="ContentRoot" Margin="19,9.5,19,0"> <Button Content="Popup を開く" HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Top" Click="OnOpenPopupButtonClicked" Width="160"/> <Button Content="Popup を閉じる" HorizontalAlignment="Left" Margin="10,60,0,0" VerticalAlignment="Top" Click="OnClosePopupButtonClicked" Width="160"/> <Popup x:Name="MyPopup" HorizontalOffset="12" VerticalOffset="130"> <Border BorderBrush="{ThemeResource AppBarItemForegroundThemeBrush}" BorderThickness="1" Background="{ThemeResource AppBarItemForegroundThemeBrush}"> <TextBlock x:Name="textBlock" Style="{StaticResource TitleTextBlockStyle}" Margin="12" FontFamily="Global User Interface" Foreground="{ThemeResource AppBarBackgroundThemeBrush}" Text="こんにちは、Popup" /> </Border> </Popup> </Grid>
Popup を開く
Popup は IsOpened プロパティをセットすることで開いたり閉じたりすることができます。コードで書くとたったこれだけ。
private void OnOpenPopupButtonClicked(object sender, RoutedEventArgs e) { this.MyPopup.IsOpen = true; } private void OnClosePopupButtonClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) { this.MyPopup.IsOpen = false; }
実行してみるとこんな感じになります。
Flyout はコントロール外をタップすると勝手に閉じてくれていましたが、Popup は IsOpen プロパティを false にするまで開きっぱなしな上に 他のコントロールに対する操作もできてしまいます。(今回の場合「Popup を閉じる」を押すまで消えてくれません)
Flyout との違い
という訳で Flyout との違いはこんな感じ。
- Popup はモードレス的、Flyout はモーダル的
- Popup は自由に配置可能、Flyout は固定 (Top または Full)
- Popup はコードから開く必要がある、Flyout はデザイナだけで片付く(事もある)
特に 上 2 つは結構大きな違いなので、作りたい画面によって使い分けが必要ですね。