■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();
}
}
}
-----
|
|