[英]WPF Constrain the resize of a canvas' child object to the dimensions of the canvas
[英]Obtaining Canvas dimensions 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>
視圖模型
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));
測量並安排哪些因素會迫使您重新計算視圖中對象的尺寸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.