获取画布尺寸wpf



我有以下代码:

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

测量和排列,强制重新计算视图中对象的尺寸。

最新更新