0

次のコードがあります。

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>

ビューモデル

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を返します。

私は何を間違っていますか?

4

1 に答える 1

0

ビューが完全に読み込まれるまで待ちますか? これらのプロパティに早くアクセスしようとすると、まだ初期化されていない可能性があります。

別の回答 (この場合、ActualWidth と ActualHeight が 0.0 である理由) は、呼び出すことを提案しています。

window.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
window.Arrange(new Rect(0, 0, window.DesiredWidth, window.DesiredHeight));

ビュー内のオブジェクトの寸法の再計算を強制する測定と配置。

于 2015-07-16T10:54:37.673 に答える