我有以下代码:
Xaml
<GroupBox x:Name="FrameStatusGroupBox" Header="Frame Status" Foreground="DarkRed" Grid.Row="3">
<ItemsControl x:Name="FrameStatusItemsControl" ItemsSource="{Binding KeepFramesSection.FrameStatus, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas x:Name="FrameStatusCanvas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="LightGray" Height="Auto" Width="Auto" IsEnabled="{Binding MarkingFileLoaded, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</GroupBox>
ViewModel
foreach (var currentCanvas in ListOfCanvases)
{
var widthRatio = FrameStatus.ActualWidth / currentCanvas.ActualWidth;
var heightRatio = FrameStatus.ActualHeight / currentCanvas.ActualHeight;
foreach (var currentBoundingBox in currentCanvas.Children)
{
var savedObj = XamlWriter.Save(currentBoundingBox);
var reader = new StringReader(savedObj);
var xmlReader = XmlReader.Create(reader);
var newChild = (UIElement) XamlReader.Load(xmlReader);
var p = ((UIElement) currentBoundingBox).TransformToAncestor(currentCanvas)
.Transform(new Point(0, 0));
p.X *= widthRatio;
p.Y *= heightRatio;
Canvas.SetLeft(newChild, p.X);
Canvas.SetTop(newChild, p.Y);
FrameStatus.Children.Add(newChild);
}
}
FrameStatus.UpdateLayout();
我试图获得原始Canvas
和新Canvas
的尺寸,因为我想将子元素从一个复制到另一个,它们的尺寸是不同的。
执行此操作时,由于某种原因,此代码:FrameStatus.ActualWidth
和此代码:FrameStatus.ActualHeight
均返回0。
我做错了什么?
是否等待视图完全加载?如果您尝试过早地访问这些属性,它们可能还没有初始化。
另一个答案(为什么ActualWidth和ActualHeight在这种情况下是0.0 ?)建议调用
window.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
window.Arrange(new Rect(0, 0, window.DesiredWidth, window.DesiredHeight));
测量和排列,强制重新计算视图中对象的尺寸。