かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ちょっとした確認するためのフライアウト出すのがめんどくさい

RC版の情報です。

以下古い情報

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;
}

もうね、ほんとむりくりやってる感じです。位置調整とか泣きたくなります。関係ない場所タップしたら閉じるようにしたりとか小細工がダルイ!そんな今日この頃でした。