昨日調べた Flyout ですが、ボタン以外の場合は 「Flyout の追加」というメニューが表示されません。
でも、ボタン以外に追加できないという訳ではなく、FlyoutBase.AttachedFlyout 添付プロパティを使うことで非ボタンコントロールにも Flyout を追加できるようになります。
解説を読むと 何やら XAML やコードをゴリゴリと (と言うほどでもないですが...) 書いていますね。ボタンだとコーディングなしで使えるのに、非ボタンになったとたんにこれですか...
せっかくなのでコーディングなしで使う方法を調べてみました。
FlyoutBase.AttachedFlyout の追加
Flyout を追加したいコントロールのプロパティをよく見ると FlyoutBase.AttachedFlyout という項目があるので「新規追加」します。
今回は MenuFlyout を追加することにしました。
コントロールの下に空の MenuFlyout ができるので、右クリックして必要なだけ MenuFlyoutItem を追加してやります。
こんな感じの XAML ができあがりました。
<Border BorderThickness="1" Height="100" Width="100" Margin="10,10,0,0" Background="{ThemeResource PhoneAccentBrush}" > <FlyoutBase.AttachedFlyout> <MenuFlyout> <MenuFlyoutItem Text="MenuFlyoutItem"/> <MenuFlyoutItem Text="MenuFlyoutItem"/> </MenuFlyout> </FlyoutBase.AttachedFlyout> </Border>
(「手で書いた方がはやい」とか聞こえてきそうですが...)
Flyout を開く
コントロールの任意のイベントで FlyoutBase.ShowAttachedFlyout メソッドを使って Flyout を開くことができます。
private void OnBorderTapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) { var border = sender as Border; if (null != border) { FlyoutBase.ShowAttachedFlyout(border); } }
でも、最後になって結局コードを書くのも負けた気がするので 先日おぼえたばかりのビヘイビアにしておきましょう。
using Microsoft.Xaml.Interactivity; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls.Primitives; namespace App8 { public class ShowFlyoutBehavior : DependencyObject, IBehavior { public DependencyObject AssociatedObject { get; private set; } // 前準備 public void Attach(DependencyObject associatedObject) { this.AssociatedObject = associatedObject; // Tapped イベントで Flyout を開くようにする ((FrameworkElement)this.AssociatedObject).Tapped += OnAssociatedObjectTapped; } // Flyout を開く private void OnAssociatedObjectTapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e) { var flyout = FlyoutBase.GetAttachedFlyout((FrameworkElement)this.AssociatedObject); if (flyout != null) { FlyoutBase.ShowAttachedFlyout((FrameworkElement)this.AssociatedObject); } } // 後始末 public void Detach() { ((FrameworkElement)this.AssociatedObject).Tapped -= OnAssociatedObjectTapped; this.AssociatedObject = null; } } }
あとはこのビヘイビアを Flyout を開きたいコントロールにドラッグ & ドロップすれば OK です。