C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: WPF Popupの表示位置について


(過去ログ 130 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■77244 / inTopicNo.1)  WPF Popupの表示位置について
  
□投稿者/ shima (1回)-(2015/09/30(Wed) 13:11:00)

分類:[C#] 

こんにちは。
C# .NetFramework4.5でWPFを使ったアプリケーションを作成しています。


Gridレイアウトを使い、Window内の縦方向に複数のRowを定義しています。
最上部のRowの高さに「*」を指定して、それより下部の全てのRowに「Auto」を指定しています。

ボタンを押すと、下部にあるRowのうち、任意のRow中のコントロールがCollapseして、
最上部のRowが縦に広がるようにしました。

下部にあるRow中のコントロールには、それぞれPopupが乗っています。
Popupが乗ったコントロールの縦位置が変わったら、そのPopupの縦位置も付随して変えたいと考えています。

しかし、ボタンを押してRowをCollapseして、コントロールの縦位置が変わっても、
Popupの縦位置には変化がありませんでした。

各コントロールのSizeChanged, LayoutUpdateイベントの発生時に、
PopupのUpdateLayout()を呼んでみましたが、
やはり変化がありません。


上記のような操作をしたときに、
Popupの縦位置を、コントロールの位置に付随させることはできないでしょうか。
問題点など、お知恵を拝借できれば幸いです。

サンプルプログラムを、以下に貼ります。
(「下を開閉」ボタンを押したときに、「上を表示」Popupが同じ位置に残ります。)
-----
■MainWindow.xaml
<Window x:Class="WpfApplication17.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="500" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <DataGrid Grid.Row="0" Background="Blue" LayoutUpdated="DataGrid_LayoutUpdated"></DataGrid>

        <DataGrid Grid.Row="1" Height="150" Name="gridUpper" Background="Yellow" SizeChanged="gridUpper_SizeChanged" IsVisibleChanged="gridUpper_IsVisibleChanged" LayoutUpdated="gridUpper_LayoutUpdated"  ></DataGrid>
        <Popup Name="popupUpper" AllowsTransparency="True" PlacementTarget="{Binding ElementName=gridUpper}" IsOpen="True" Width="100" Height="25" >
            <Label>上に表示</Label>
        </Popup>

        <DataGrid Grid.Row="2" Height="150" Name="gridBottom" Background="Pink" SizeChanged="gridBottom_SizeChanged" IsVisibleChanged="gridBottom_IsVisibleChanged" LayoutUpdated="gridBottom_LayoutUpdated" ></DataGrid>
        <Popup Name="popupBottom" AllowsTransparency="True" PlacementTarget="{Binding ElementName=gridBottom}" IsOpen="True" Width="100" Height="25" >
            <Label>下に表示</Label>
        </Popup>

        
        <StackPanel Grid.Row="3" Orientation="Horizontal">
            <Button Width="100" Click="Button_Click_1" >上を開閉する</Button>
            <Button Width="100" Click="Button_Click_2" >下を開閉する</Button>
        </StackPanel>
    </Grid>
</Window>

■MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication17
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            if (gridUpper.Visibility == System.Windows.Visibility.Visible)
            {
                popupUpper.IsOpen = false;
                gridUpper.Visibility = System.Windows.Visibility.Collapsed;
            }
            else
            {
                popupUpper.IsOpen = true;
                gridUpper.Visibility = System.Windows.Visibility.Visible;
            }
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            if (gridBottom.Visibility == System.Windows.Visibility.Visible)
            {
                popupBottom.IsOpen = false;
                gridBottom.Visibility = System.Windows.Visibility.Collapsed;
            }
            else
            {
                popupBottom.IsOpen = true;
                gridBottom.Visibility = System.Windows.Visibility.Visible;
            }
        }

        private void gridUpper_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            SetPopupPlacement();
        }

        private void gridBottom_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            SetPopupPlacement();
        }

        private void SetPopupPlacement()
        {
            popupUpper.PlacementRectangle = new Rect(gridUpper.ActualWidth - popupUpper.Width - 30, 3, 0, 0);
            popupUpper.UpdateLayout();

            popupBottom.PlacementRectangle = new Rect(gridBottom.ActualWidth - popupBottom.Width - 30, 3, 0, 0);
            popupBottom.UpdateLayout();
        }

        private void gridUpper_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            SetPopupPlacement();
        }

        private void gridBottom_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            SetPopupPlacement();
        }

        private void gridUpper_LayoutUpdated(object sender, EventArgs e)
        {
            SetPopupPlacement();
        }

        private void gridBottom_LayoutUpdated(object sender, EventArgs e)
        {
            SetPopupPlacement();
        }

        private void DataGrid_LayoutUpdated(object sender, EventArgs e)
        {
            SetPopupPlacement();
        }
    }
}
-----

引用返信 編集キー/
■77252 / inTopicNo.2)  Re[1]: WPF Popupの表示位置について
□投稿者/ shima (2回)-(2015/09/30(Wed) 21:05:30)
いろいろ試したのですが、Popupを常時表示しようとすると、ほかにもいろいろ問題がありまして
(Windowが表示されたり、タブを切り替えると隠れてしまう)
別の表現方法に変えることにしました。
例えば、DataGridのヘッダに、Popupと同じ内容を描画するなどです。

ご協力ありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -