为什么ActualWidth和ActualHeight从0,0开始?

时间:2011-01-05 04:18:18

标签: wpf selection inkcanvas actualwidth actualheight

我想将WPF路径添加到InkCanvas并使用选择来选择WPF路径。 所以,我使用这段代码。

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;    
drawCanvas.Children.RemoveAt(i);
inkCanvas.Children.Add(path);

这是输出。我必须从0,0中选择WPF路径,因为ActualwidthActualHeight从0,0开始。

alt text

如何选择绝对WPF路径?

由于

修改

现在,我可以使用此代码完全选择它。

System.Windows.Shapes.Path path = drawCanvas.Children[i] as System.Windows.Shapes.Path;
drawCanvas.Children.RemoveAt(i);
path.Margin = new Thickness(-getMinX(path), -getMinY(path), 0, 0);
containPath.Children.Add(path);
containPath.Width = getMaxX(path) - getMinX(path);
containPath.Height = getMaxY(path) - getMinY(path);
containPath.Margin = new Thickness(getMinX(path), getMinY(path), 0, 0);
inkCanvas.Children.Add(containPath);

2 个答案:

答案 0 :(得分:4)

您可以使用InkCanvas上的UIElement.UpdateLayout Method来更新FrameworkElement.ActualWidth PropertyActualHeight。有关为何需要这些内容的背景信息,请参阅ActualWidth链接。

修改

我误解了这个问题。并非ActualWidthActualHeight为零,但其值与(0, 0)上的InkCanvas相关。这个问题的一个很好的解决方案是将Path包裹在Canvas中并使用Margin进行定位,如下所示:

<Canvas Width="50" Height="50" Margin="200,200,0,0">
    <Line
        X1="0" Y1="0"
        X2="50" Y2="50"
        Stroke="Black"
        StrokeThickness="4" />
</Canvas>

表现得像:

alt text

这种方法的缺点是用户必须套索Canvas这是一个矩形,而不是任意形状。然而,它比套索来源要好得多。

答案 1 :(得分:0)

对于只能通过控制点定义的元素(例如Line,Path等,而不是Rectangle,Ellipse等),当你将它添加到item控件时(我假设InkCanvas是因为它支持选择) ,首先将画布添加到面板0,0。画布的宽度和Height由控制点的最大X和Y坐标确定。在此之后,元素将作为此画布的子项添加。

您还会看到,只要您看到带有元素的这种行为,该元素就不会支持布局属性,如水平/垂直对齐等。

我看到的唯一方法是从路径中的坐标手动查找ActualWidthActualHeight

修改:这取决于个人经验,而非任何文档。