2011-01-05 163 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

相關問題