Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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
C# 对象';s实际宽度和实际高度报告为0?_C#_Wpf_Frameworkelement_Actualwidth_Actualheight - Fatal编程技术网

C# 对象';s实际宽度和实际高度报告为0?

C# 对象';s实际宽度和实际高度报告为0?,c#,wpf,frameworkelement,actualwidth,actualheight,C#,Wpf,Frameworkelement,Actualwidth,Actualheight,我有一个应用程序,它包含一个Grid的多个实例,该实例继承自一个扩展UserControl的抽象类,如下所示: <abstract:ScoringGrid x:Class="ReadProject.Repeater.ScoringGrid" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.

我有一个应用程序,它包含一个
Grid
的多个实例,该实例继承自一个扩展
UserControl
的抽象类,如下所示:

<abstract:ScoringGrid x:Class="ReadProject.Repeater.ScoringGrid"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:abstract="clr-namespace:ReadProject.AbstractRepeater"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid x:Name="ScoringGridInstance" Width="Auto" Height="Auto">
....
这些网格是在运行时动态构建的,每个网格的大小可以不同。当用户关闭应用程序时,我希望捕获每个
网格的屏幕截图
,并将其保存到本地计算机。为此,我创建了一个方法来获取对象大小,并使用
RenderTargetBitmap()
将其保存到一个文件中。许多网格保存时没有问题,但是一些网格返回
0
ActualWidth
ActualHeight
,因此没有保存。我不确定从哪里开始调试这个问题,因为它们都是相同对象的实例;他们中的一些人怎么可能设置了他们的
实际宽度
实际高度
而其他人没有?它们都在应用程序中显示,没有问题


如果您需要更多信息/代码,请告诉我。谢谢

为了完整起见,我可以在捕获每个
UserControl
的屏幕截图之前,通过将这些调用添加到每个
UserControl来解决这个问题:

scoreGrid.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                scoreGrid.Arrange(new Rect(0, 0, scoreGrid.ScoreGridInstance.DesiredSize.Width, scoreGrid.ScoreGridInstance.DesiredSize.Height));

加载用户控件后,您是否尝试读取这些值?同时检查此链接@iltzortz中的答案我查看了您链接的问题,并尝试在每个
网格中循环,称为
Measure(新大小(double.PositiveInfinity,double.PositiveInfinity));这也导致了同样的问题。我刚才说的答案部分是:
您可以通过在窗口的InitializeComponent()之后手动调用窗口的Measure()和Arrange()方法,强制更早地计算这些值返回。
measure和arrange函数没有参数我在该答案的注释中看到了这一点,这就是为什么我将参数传递给
measure()
window.measure返回void。
但是,我为每个函数添加了对
arrange()
的调用,这似乎有效。然而,他们到底在做什么,为什么他们是必要的?我还有更大的
网格
,它封装了两个
ScoringGrid
s,但是当我尝试用这些网格做同样的事情时,只捕获了顶部而不是整个网格,知道为什么吗?
scoreGrid.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
                scoreGrid.Arrange(new Rect(0, 0, scoreGrid.ScoreGridInstance.DesiredSize.Width, scoreGrid.ScoreGridInstance.DesiredSize.Height));