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