2011-01-05 164 views
6

我想将WPF路径添加到InkCanvas并使用选择来选择WPF路径。 所以,我使用这个代码。为什么ActualWidth和ActualHeight从0,0开始?

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

这是输出。我必须从0,0中选择WPF Path,因为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); 

回答

4

您可以使用UIElement.UpdateLayout MethodInkCanvas更新FrameworkElement.ActualWidth PropertyActualHeight。请参阅ActualWidth链接了解为什么需要这种背景信息。

编辑:

我误解了这个问题。并非ActualWidthActualHeight为零,但它们的值相对于InkCanvas上的(0, 0)。一个非常不错的解决问题的方法是来包装PathCanvas和使用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这是一个矩形,而不是任意形状。尽管如此,它要比套索物体更好。

+0

我不认为UpdateLayout会做任何事情。 – NVM 2011-01-05 05:35:32

+0

我们没有足够的代码来测试理论,但是如果'UIElement.IsMeasureValid'是'false',那么'ActualWidth'和'ActualHeight'没有希望是正确的。 – 2011-01-05 05:42:46

+0

请看我的答案。在我之前的评论中,我的意思是说,UpdateLayout不会为“路径”做任何事情。 – NVM 2011-01-05 05:44:55

0

对于只能通过控制点定义的元素(例如线条,路径等与矩形,椭圆等),当您将其添加到项目控件(我假设InkCanvas是因为它支持选择),首先画布被添加到面板在0,0。画布的宽度和Height由控制点的最大X和Y坐标确定。在此之后,该元素作为此画布的子元素添加。

你也可以看到,每当你看到这种行为与元素,该元素不会支持布局属性一样水平/垂直对齐等

我解决此看到的唯一方法是找到ActualWidth和手动从路径中的坐标移动到ActualHeight

编辑:这是从个人的经验,而不是从任何文件。

+0

我现在可以手动找到ActualWidth和ActualHeight。但是我不能将它们设置为ActualWidth和ActualHeight,因为它们是只读的。 – 2011-01-05 06:06:52

+0

ActualWidth和ActualHeight是只读依赖项属性(如果内存正确)。你根本不能也不应该自己设置。 – NVM 2011-01-05 06:13:48

+1

对于选择装饰者,你将不得不做很多手动的东西来做你想做的。将项目添加到inkcanvas时,它将被包装到容器项目中。该容器项目是选择装饰者所装饰的内容。由于您的容器包含从0,0开始的画布,因此您会看到奇怪的选择框。您需要创建派生的容器项目,它自己负责选择装饰。 – NVM 2011-01-05 06:17:35

相关问题