2011-01-05 7 views
6

Desidero aggiungere Percorso WPF a InkCanvas e utilizzare la selezione per selezionare Percorso WPF. Quindi, io uso questo codice.Perché ActualWidth e ActualHeight iniziano da 0,0?

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

Questa è l'uscita. Devo selezionare Percorso WPF da 0,0 perché Actualwidth e ActualHeight iniziano da 0,0.

alt text

Come faccio a selezionare il percorso assoluto WPF?

Grazie

Edit:

Ora, posso selezionare assolutamente utilizzando questo codice.

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

risposta

4

È possibile utilizzare il UIElement.UpdateLayout Method sul InkCanvas per aggiornare il FrameworkElement.ActualWidth Property e ActualHeight. Vedere il collegamento ActualWidth per informazioni di background sul motivo per cui è necessario.

Edit:

ho capito male la domanda. Non che ActualWidth e ActualHeight erano pari a zero, ma che i loro valori erano relativi alla (0, 0) sul InkCanvas. Una buona soluzione al problema è quello di avvolgere il Path in un Canvas e posizionarlo con Margin in questo modo:

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

che si comporta come:

alt text

Lo svantaggio di questo approccio è la l'utente deve eseguire il laccio con lo Canvas che è un rettangolo, non una forma arbitraria. Tuttavia, è molto meglio che dover lazare l'oggetto e l'origine.

+0

Non penso che UpdateLayout farà nulla. – NVM

+0

Non abbiamo abbastanza codice per testare la teoria ma se 'UIElement.IsMeasureValid' è' false', non c'è speranza che 'ActualWidth' e' ActualHeight' siano corretti. –

+0

Si prega di vedere la mia risposta. Nel mio precedente commento intendevo dire che UpdateLayout non farà nulla per un 'Path' – NVM

0

Per gli elementi che può essere definito solo attraverso i punti di controllo (ad esempio linea, un percorso ecc contro Rettangolo, Ellisse, ecc) quando lo si aggiunge a un controllo elementi (che presumo il InkCanvas è dal momento che supporta la selezione), prima di un la tela viene aggiunta al pannello a 0,0. La larghezza e il Height dell'area di disegno sono determinati dalle coordinate X e Y massime dei punti di controllo. Dopo questo l'elemento viene aggiunto come figlio di questa tela.

Si vedrà anche che ogni volta che si vede questo tipo di comportamenti con un elemento, l'elemento di solito supporta Proprietà layout come orizzontale/Allineamento verticale ecc

L'unico modo che vedo intorno a questo è quello di trovare il ActualWidth e ActualHeight manualmente dalle coordinate nel percorso.

Modifica: Questo è da esperienza personale e non da qualsiasi documentazione.

+0

Ora posso trovare manualmente ActualWidth e ActualHeight. Ma non posso impostarli su ActualWidth e ActualHeight perché sono di sola lettura. –

+0

ActualWidth e ActualHeight sono proprietà di dipendenza di sola lettura (se la memoria viene utilizzata correttamente). Semplicemente non puoi e non dovresti impostarlo da solo. – NVM

+1

Per gli addetti alla selezione, dovrai fare molte cose manuali per fare quello che vuoi. Quando aggiungi un oggetto a un inkcanvas, verrà inserito in un oggetto contenitore. Questo oggetto contenitore è ciò che è decorato dall'ornatore di selezione. Dato che il tuo contenitore contiene la tela a partire da 0,0, vedi la casella di selezione dispari. È necessario creare un oggetto contenitore derivato che si prende cura degli ornamenti di selezione da soli. – NVM