Как рассчитать ActualWidth ActualHeight перед показом окна
Я пытаюсь посчитать StackPanel
width
, height
(находится в средней ячейке сетки) перед отображением окна (например, в конструкторе окна). Как это может быть достигнуто?
<Window x:Class="WpfApplication2.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="300" Width="300">
<Grid Name="grid">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<StackPanel Grid.Row="1" Grid.Column="1" Name="stackPanel"></StackPanel>
</Grid>
Измерение для окна также как для наборов stackPanel DesiredSize
в {0;0}
public partial class TestWindow : Window
{
public TestWindow()
{
InitializeComponent();
this.Measure(new Size(this.Width, this.Height)); // -> this.DesiredSize = {0;0}
...
}
}
EDIT1
Следующие работы для FixedPage:
fixedPage.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
fixedPage.Arrange(new Rect(0, 0, fixedPage.DesiredSize.Width, fixedPage.DesiredSize.Height));
Тогда мы можем получить доступ stackPanel.ActualWidth
а также stackpanel.ActualHeight
,
Но для Окна это не работает.
1 ответ
Попробуйте Loaded
событие:
public TestWindow()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(TestWindow_Loaded);
}
void TestWindow_Loaded(object sender, RoutedEventArgs e)
{
//this.DesiredSize shouldnt be {0,0} now
}
РЕДАКТИРОВАТЬ: в связи с тем, что StackPanel
уже берет максимум Size
даже без предметов, его SizeChanged
Событие будет запущено только в том случае, если вы добавите много предметов, так что вы можете использовать SizeChanged
событие вашего StackPanel
как это:
private void spTest_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (!(e.PreviousSize.Height == 0 && e.PreviousSize.Width == 0)) //will also be fired after loading
{
//Create another Page
}
}
EDIT2: еще одно возможное решение:
public MainWindow()
{
InitializeComponent();
yourStackPanelName.Loaded += new RoutedEventHandler(yourStackPanelName_Loaded);
}
void yourStackPanelName_Loaded(object sender, RoutedEventArgs e)
{
double height = ((StackPanel)sender).ActualHeight;
double width = ((StackPanel)sender).ActualWidth;
}