Créer un contrôle des ressources et le réutiliser dans XAML WPF

j'essaie juste de créer un symbole simple/géométrie/contrôle et le changer et le réutiliser à plusieurs endroits dans la même fenêtre.

Exemple: un carré noir avec un cercle au milieu.

le cercle devrait alors changer entre le rouge et le vert (semblable à un feu stop). Le faire avec des images marcherait. J'essaie de le résoudre comme une ressource de fenêtre, mais je ne comprends pas.

L'idée: je l'écris dans une ressource, ici, j'ai essayer dans un Toile:

<Window.Resources>
    <Canvas x:Key="Ampel">
        <Rectangle Fill="Black" HorizontalAlignment="Left" Height="52" Stroke="Black"       VerticalAlignment="Top" Width="50"/>
        <Ellipse x:Name="RedGreen" Fill="Red" HorizontalAlignment="Left" Height="27" Margin="11,12,0,0" Stroke="Black" VerticalAlignment="Top" Width="28" RenderTransformOrigin="0.214,0.256"/>
    </Canvas>
</Window.Resources>

alors je voudrais le placer dans une grille ou un panneau, mais comment puis-je le référencer?

<Canvas x:Name="RedGreen1" Height="50" Width="50" DataContext="{DynamicResource Ampel}" /> 

ceci ne renvoie pas une erreur de compilateur, mais ne montre rien dans la fenêtre. Ça ne marche pas non plus avec WrapPanel ou autre chose.

Et si ça marcherait, comment pourrais-je référence dans le code-derrière pour changer la couleur du cercle. Quelque chose comme RedGreen1.RedGreen.Fill=Brushes.Green?

j'ai lu les articles sur les feux de signalisation. Est-il vraiment nécessaire de créer un UserControl ou est-il un moyen de le résoudre avec fenêtre.ressources?

idée Générale de l'application est d'avoir une liste de paramètres. Chaque entrée correcte est marquée en vert et le calcul ne peut être démarré que si tous les paramètres sont marqués en vert.

et même si je le fais tourner avec des images rouges/vertes, j'essaie de mieux comprendre WPF/XAML et d'apprendre quelque chose.

je vous Remercie.

19
demandé sur Anatoliy Nikolaev 2014-04-09 14:47:48

3 réponses

Lorsque vous définissez un Contrôle arbitraire dans Resources, vous pouvez l'utiliser à l'avenir dans le contrôle qui ont la propriété Content et dérivée de Control classe. Ces sont les suivants: ContentControl,Label,ContentPresenter, etc.

vous devez aussi définir x:Shared="False" pour les ressources si vous souhaitez utiliser cette ressource dans de nombreux Contrôles, car x:Shared="True" par défaut, puis une Ressource est commune à tous - dans ce cas, le système jure sur le contenu dupliqué. Lorsque x:Shared="False" quand est créée la ressource pour chaque élément quand il sa demande. Citation de MSDN:

Lorsque la valeur false, modifie le comportement de récupération de ressources du WPF de sorte que les requêtes pour la ressource attribuée créent une nouvelle instance pour chaque requête au lieu de partager la même instance pour toutes les requêtes.

Exemple:

<Window.Resources>
    <Canvas x:Key="Ampel" x:Shared="False">
        <Rectangle Fill="Black" HorizontalAlignment="Left" Height="52" Stroke="Black" VerticalAlignment="Top" Width="50"/>
        <Ellipse x:Name="RedGreen" Fill="Red" HorizontalAlignment="Left" Height="27" Margin="11,12,0,0" Stroke="Black" VerticalAlignment="Top" Width="28" />
    </Canvas>
</Window.Resources>

<Grid>
    <ContentControl Name="MyContentControl" Content="{StaticResource Ampel}" HorizontalAlignment="Left" />        
    <Label Name="MyLabel" Content="{StaticResource Ampel}" HorizontalAlignment="Center" />
    <ContentPresenter Name="MyContentPresenter" Content="{StaticResource Ampel}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

modifier Fill de Ellipse dans le code-behind, vous pouvez comme ceci:

private void ChangeBackground_Click(object sender, RoutedEventArgs e)
{
    var canvas = MyContentControl.Content as Canvas;

    if (canvas != null)
    {
        foreach (var item in canvas.Children)
        {
            if (item is Ellipse)
            {
                ((Ellipse)item).Fill = Brushes.Green;
            }
        }
    }
}
20
répondu Anatoliy Nikolaev 2014-04-09 12:14:24

canvas n'a pas de propriété de template c'est pourquoi nous utilisons contencontrol ici.

<Window.Resources>
    <ControlTemplate x:Key="Ampel" TargetType="ContentControl">
        <Canvas>
            <Rectangle Fill="Black" HorizontalAlignment="Left" Height="52" Stroke="Black" VerticalAlignment="Top" Width="50"/>
            <Ellipse x:Name="RedGreen" Fill="{Binding Path=Tag, RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Left" Height="27" Margin="11,12,0,0" Stroke="Black" VerticalAlignment="Top" Width="28" RenderTransformOrigin="0.214,0.256"/>
        </Canvas>
    </ControlTemplate>
</Window.Resources >

<ContentControl  Template="{StaticResource Ampel}" Tag="Red" ></ContentControl>
<ContentControl  Template="{StaticResource Ampel}" Tag="Green" ></ContentControl>
<ContentControl  Template="{StaticResource Ampel}" Tag="Blue" ></ContentControl>

Sortie

enter image description here

4
répondu Heena Patil 2014-04-09 12:04:47

Vous pouvez utiliser le code C# du patrimoine:

public class customBottum : Buttom
{
        int var1;
        bool var2;

        public customBottum()
        {
            InitializeComponent();
        }

        other function ...
}
-1
répondu mister 2014-04-09 11:19:31