Как рассчитать ActualWidth ActualHeight перед показом окна

Я пытаюсь посчитать StackPanelwidth, 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;
}
Другие вопросы по тегам