Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 窗口显示前如何计算实际宽度实际高度_.net_Wpf_Window_Measure_Actualwidth - Fatal编程技术网

.net 窗口显示前如何计算实际宽度实际高度

.net 窗口显示前如何计算实际宽度实际高度,.net,wpf,window,measure,actualwidth,.net,Wpf,Window,Measure,Actualwidth,我试图在窗口显示之前(例如在窗口构造函数中)计算堆栈面板宽度,高度(位于网格的中间单元格)。如何实现这一目标 <Window x:Class="WpfApplication2.TestWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TestWin

我试图在窗口显示之前(例如在窗口构造函数中)计算
堆栈面板
宽度
高度
(位于网格的中间单元格)。如何实现这一目标

<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>
编辑1

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


但对于窗口,它不起作用。

请尝试加载的
事件:

public TestWindow()
{
    InitializeComponent();
    this.Loaded += new RoutedEventHandler(TestWindow_Loaded);
}

void TestWindow_Loaded(object sender, RoutedEventArgs e)
{
    //this.DesiredSize shouldnt be {0,0} now
}
EDIT:由于
StackPanel
已经占据了最大的
Size
,即使没有项目,它的
SizeChanged
事件也只会在您添加了很多项目的情况下被触发,因此您可以像这样使用
StackPanel
SizeChanged
事件:

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

它适用于窗口,但此处的窗口仅为示例。我需要在FixedPage中放置网格,我必须找到stackPanel的尺寸作为此页面的内容区域-这有助于回答我可以放入多少项。。。对于我定义的每个项目,现在是高度,然后到达页面末尾,我需要创建另一个页面,依此类推……为什么需要设置StackPanel的高度和宽度?没有项目的Stackpanel始终采用其父区域的高度和宽度,因此您不需要通过代码设置这些。我希望未设置高度和宽度,并且如之前所述,我需要此项来确定Stackpanel中可能存在的项目数。如果我把更多的东西放进去,它们在FixedPagethank中是看不见的,但这不适合我。。。。每次您将DocumentViewer滚动到带有已加载事件的FixedPage时,它都将被执行……也许您应该发布更多的程序代码,以便我们知道什么适合您。
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;
}