2011-02-02 25 views
5

Voglio avere una tela in xaml dove posiziono alcune icone. Queste icone sono poligoni come questo:Poligono riutilizzabile

<Polygon Points="0,0 20,50, 0,50 20,0" Fill="Red" Stretch="Uniform"/> 

ma voglio utilizzare un'icona più volte, quindi voglio definirlo nelle risorse e comprendono per riferimento nella tela in una certa posizione, in qualche modo come questo :

<Page.Resources> 
    <Polygon Key="icon1" Points="0,0 20,50, 0,50 20,0" Fill="Red" Stretch="Uniform"/> 
    <Polygon Key="icon2" Points="0,0 10,30, 10,60 20,0" Fill="Blue" Stretch="Uniform"/> 
    ... 
</Page.Resources>  
<Canvas> 
    <Polygon Reference="icon1" X="0" Y="0"/> 
    <Polygon Reference="icon2" X="10" Y="10"/> 
    <Polygon Reference="icon1" X="20" Y="20"/> 
    ...   
</Canvas> 

ho trovato una possibile soluzione sul http://www.codeproject.com/KB/WPF/GraphicInXAMLAndWPF.aspx cui i poligoni vengono memorizzati in un'immagine di disegno, ma sembra essere di troppo sovraccarico.

Qualcuno ha un'idea migliore di come risolvere questo?

risposta

7

Probabilmente il metodo più ovvio e flessibile è creare un controllo utente. È possibile aggiungere un nuovo file di tipo UserControl da solution explorer, aggiungere Polygon alla griglia "LayoutRoot" creata da Visual Studio. Puoi quindi creare tutte le istanze che desideri del tuo controllo utente!

Tuttavia, per verificare problemi simili su SO, è possibile utilizzare un controllo contenuto per eseguire il rendering del poligono, nota, si dovrebbe utilizzare x: Shared = "false" per garantire che non si stia tentando di riutilizzare il stesso poligono ogni volta.

<Page.Resources> 
    <Polygon x:Key="icon1" x:Shared="False" 
      Points="0,0 20,50, 0,50 20,0" Fill="Red" Stretch="Uniform"/> 
    <Polygon x:Key="icon2" x:Shared="False" 
      Points="0,0 10,30, 10,60 20,0" Fill="Blue" Stretch="Uniform"/> 
    ... 
</Page.Resources>  
<Canvas> 
    <ContentControl Content="{StaticResource icon1}" Canvas.Top="0" Canvas.Left="0"/> 
    <ContentControl Content="{StaticResource icon2}" Canvas.Top="0" Canvas.Left="10"/> 
    <ContentControl Content="{StaticResource icon1}" Canvas.Top="0" Canvas.Left="20"/> 
    ...   
</Canvas> 

vedere il seguente:

+0

ho già pensato a questo, ma credo che, ci deve essere una soluzione più facile con meno overhead. È solo un piccolo poligono. – SpeziFish

+0

Vedere la mia risposta aggiornata - spero che questo aiuti! – ColinE

+0

Wow, molto bello, esattamente quello che stavo cercando, grazie! – SpeziFish