かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

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

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