RC版の情報です。
部品化して公開しました 2012/08/15 追記
以下古い情報
Metro Style App(コードネーム)で、AppBarのボタン押したときに、本当にそれでいいの?って雰囲気のフライアウトを出すのがすごいめんどくさいことに気づきました。
ポップアップメニューとかは、若干めんどくさいながらもクラスがあります。そしてMessageDialogでダイアログも出せます。なので怠けようと思ったらDialogだしてしまえ〜って所なんですが、そんなんでユーザーの思考をぶったぎってしまうのはMetro Style App(コードネーム)的にはNGでしょう。
ということで!!まだ見た目イマイチだけど、これを微調整すればいけそうだというコードをさくっと書いたので晒しておきます。
AppBarにいっぱいボタンをおいて、クリックイベントハンドラで以下のように書きます。
private void Button_Click_1(object sender, RoutedEventArgs e) { var panel = new StackPanel { Width = 200, Height = 75, Background = new SolidColorBrush(Colors.White), HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top, }; panel.Tapped += (_, args) => args.Handled = true; panel.Children.Add(new TextBlock { Text = "ほんとうにやってもいいの?ねぇほんとうに??", Foreground = new SolidColorBrush(Colors.Black), }); var btn = new Button { Foreground = new SolidColorBrush(Colors.Black), BorderBrush = new SolidColorBrush(Colors.Black), Margin = new Thickness(2.5), Content = "OK", HorizontalAlignment = HorizontalAlignment.Left }; panel.Children.Add(btn); var grid = new Grid { Width = Window.Current.Bounds.Width, Height = Window.Current.Bounds.Height, Background = new SolidColorBrush(Colors.Transparent) }; grid.Children.Add(panel); var popup = new Popup { Width = Window.Current.Bounds.Width, Height = Window.Current.Bounds.Height, Child = grid, IsOpen = true, }; btn.Click += async (_, __) => { var dlg = new MessageDialog("やらかした"); await dlg.ShowAsync(); popup.IsOpen = false; }; grid.Tapped += (_, __) => popup.IsOpen = false; // Panelの位置調整 var gt = ((UIElement)sender).TransformToVisual(null); var p = gt.TransformPoint(new Point()); p.X += ((Control)sender).ActualWidth; var transform = new TranslateTransform { X = p.X - panel.Width, Y = p.Y - panel.Height - 25, }; panel.RenderTransform = transform; }
もうね、ほんとむりくりやってる感じです。位置調整とか泣きたくなります。関係ない場所タップしたら閉じるようにしたりとか小細工がダルイ!そんな今日この頃でした。