2011-01-05 12 views
6

WPF Yolu'na InkCanvas eklemek istiyorum ve WPF Yolu'nu seçmek için seçim kullanın. Yani, bu kodu kullanıyorum.Neden ActualWidth ve ActualHeight 0,0'dan başlıyor?

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

Bu çıktıdır. Actualwidth ve ActualHeight 0,0'dan başlayarak 0,0'dan WPF Yolu seçmem gerekiyor.

alt text

nasıl mutlak WPF Path seçilir?

Teşekkür

Düzenleme:

Şimdi, kesinlikle bu kodu kullanarak seçebilirsiniz.

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); 

cevap

4

Sen FrameworkElement.ActualWidth Property ve ActualHeight güncellemek için InkCanvas üzerinde UIElement.UpdateLayout Method kullanabilirsiniz. Bunun neden gerekli olduğu hakkında arka plan bilgisi için ActualWidth bağlantısına bakın.

Düzenleme:

Soruyu yanlış anladım. ActualWidth ve ActualHeight'un sıfır olmadığı, ancak değerlerinin üzerinde (0, 0)'a göre olmadığı. gibi davranır

<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

Bu yaklaşımın dezavantajı olduğunu sorununa oldukça iyi çözüm Canvas içinde Path sarın ve bunun gibi Margin kullanarak konumlandırmak için Kullanıcı bir dikdörtgen değil, keyfi bir şekil olan Canvas kementine sahiptir. Yine de, nesneyi ve nesnesinin kementine sahip olmaktan çok daha iyidir.

+0

UpdateLayout'un herhangi bir şey yapacağını düşünmüyorum. – NVM

+0

Teoriyi sınamak için yeterli kodumuz yok, ancak "UIElement.IsMeasureValid" false ise, "ActualWidth" ve "ActualHeight" öğelerinin doğru olması konusunda bir umut yoktur. –

+0

Lütfen cevabımı bakın. Daha önceki yorumumda, UpdateLayout'un bir 'Yol' için hiçbir şey yapmayacağını söylemek istedim. – NVM

0

Yalnızca bir denetim nesnesine eklediğinizde (örn. InkCanvas seçimini desteklediğinden dolayı) kontrol noktaları (örn. Dikdörtgen, Elips vb. Gibi Çizgi, Yol vb.) Ile tanımlanabilen öğeler için, önce tuval 0,02 de panele eklendi. Kanvasın genişliği ve Height, kontrol noktalarının maksimum X ve Y koordinatlarından belirlenir. Bundan sonra eleman bu kanvasın bir çocuğu olarak eklenir.

Ayrıca bir eleman ile davranışları bu tür gördüklerinde, eleman alışkanlık vb

Yatay/Dikey hizalama gibi bu etrafımızda gördüğümüz tek yolu Düzen Özellikler 'desteklediğini göreceksiniz

ActualWidth bulmaktır ve ActualHeight yoldaki koordinatlardan manuel olarak.

Düzenleme: Bu, herhangi bir belgeden değil, kişisel deneyimden kaynaklanmaktadır.

+0

Şu anda ActualWidth ve ActualHeight öğelerini şimdi manuel olarak bulabilirim. Ancak onları yalnızca okunan Çünkü ActualWidth ve ActualHeight için ayarlayamıyorum. –

+0

ActualWidth ve ActualHeight salt okunur bağımlılık özellikleridir (bellek doğruysa). Bunu kendiniz ayarlayamazsınız ve ayarlamamalısınız. – NVM

+1

Seçici süsleyiciler için, istediğiniz şeyi yapmak için çok fazla manuel malzeme yapmanız gerekecektir. Bir inkcanvasına bir öğe eklediğinizde, bir kapsayıcı öğeye sarılır. Bu konteyner öğesi seçim sahibinin nezdinde süslenmiştir. Kapsayıcı 0,0'dan başlayan tuvali içerdiğinden, tek seçim kutusunu görürsünüz. Seçim eşyalarını kendiniz halleden türetilmiş bir konteyner öğesi oluşturmanız gerekir. – NVM

İlgili konular