2017-02-20 2 views
0

J'essaye simplement de définir le remplissage de tous les éléments rectangle du deuxième panneau de pile (des deux dans le stackpanel racine), le nécessaire remplir étant blanc. Puisqu'un stackpanel n'a pas ItemTemplate, j'ai essayé de le remplacer par, puis de l'encapsuler avec ItemsControl. L'encapsulation du panneau de pile est arrivée quand j'ai vu que ItemsControl n'a pas de propriété Orientation.Appliquer un style à tous les éléments enfants d'un certain stackpanel (ou commande)

De toute façon, après tout cela, les rectangles enfants ne sont toujours pas remplis de blanc ...>. < qu'est-ce que je fais mal?

(J'essaie aussi de faire la même chose avec les bindings d'événements comme How to set an event function via a style? Je suis toujours en train d'essayer des choses là-bas, je pensais que je voulais aussi le faire via ItemControl.)

<Window x:Class="RegenboogDragDrop.WindowRegenboog" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="WindowRegenboog" Height="350" Width="525"> 
<Window.Resources> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Setter Property="Height" Value="50"></Setter> 
     <Setter Property="Width" Value="50"></Setter> 
     <Setter Property="Margin" Value="5"></Setter> 
     <Setter Property="Stroke" Value="Black"></Setter> 
     <Setter Property="StrokeThickness" Value="3"></Setter> 
    </Style> 

</Window.Resources> 
    <StackPanel> 
    <StackPanel Margin="0,50" Orientation="Horizontal" HorizontalAlignment="Center"> 
     <Rectangle Fill="Yellow" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Orange" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Red" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Blue" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Green" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Violet" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Indigo" MouseMove="Rectangle_MouseMove"></Rectangle> 
    </StackPanel> 
    <ItemsControl Name="DropZone" HorizontalAlignment="Center"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <Rectangle Fill="White"/> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 

     <StackPanel Orientation="Horizontal"> 
     <Rectangle Name="dropRed" Fill="White"/> 
     <Rectangle Name="dropOrange" MouseMove="Rectangle_MouseMove" DragDrop.DragEnter="Rectangle_DragEnter" DragDrop.DragLeave="Rectangle_DragLeave" DragDrop.Drop="Rectangle_Drop" AllowDrop="True"></Rectangle> 
     <Rectangle Name="dropYellow" Fill="White" MouseMove="Rectangle_MouseMove" DragDrop.DragEnter="Rectangle_DragEnter" DragDrop.DragLeave="Rectangle_DragLeave" DragDrop.Drop="Rectangle_Drop" AllowDrop="True"></Rectangle> 
     <Rectangle Name="dropGreen"></Rectangle> 
     <Rectangle Name="dropBlue"></Rectangle> 
     <Rectangle Name="dropIndigo"></Rectangle> 
     <Rectangle Name="dropViolet"></Rectangle> 
     </StackPanel> 
    </ItemsControl> 
    <Button Name="ButtonCheck" Content="Check volgorde" Margin="5,50"></Button> 
</StackPanel> 

code

derrière si vous voulez l'essayer: (Sur la deuxième ligne du troisième carré peut recevoir des couleurs par glisser-déposer, tandis que le second a tous les événements, mais pas le remplissage nécessaire que je suis en train d'essayer) (DutchVarsTo Anglais: rechthoek signifie carré, kleur signifie la couleur, gesleepteKleur signifie draggedColor, sommeil signifie glisser):

https://defuse.ca/b/c19ncFwllWIpSRe6I0cclp (je ne peux pas comprendre comment réduire un C# snippet comme les js snippet ici https://meta.stackexchange.com/questions/70885/collapse-code-snippets-in-answers: S lien si pastebin à codebehind)

Répondre

1

disqualifier un rectangle de style dans les ressources du StackPanel:

<StackPanel> 
    <StackPanel.Resources> 
     <Style TargetType="Rectangle"> 
      <Setter Property="Fill" Value="White"/> 
     </Style> 
    </StackPanel.Resources> 

    <Rectangle .../> 
    ... 
</StackPanel> 

Si vous avez un autre défaut supérieur Rectangle style en t il arborescence des éléments, vous pouvez baser votre « style par défaut locale » sur ce style soit un moyen de BasedOn propriété du style, comme

<StackPanel.Resources> 
    <Style TargetType="Rectangle" BasedOn="{StaticResource {x:Type Rectangle}}"> 
     <Setter Property="Fill" Value="White"/> 
    </Style> 
</StackPanel.Resources> 
+0

Une solution élégante et vous avez un upvote de moi dès que j'accepte une réponse (alors j'aurai 15 rep), mais dans ce cas, j'essaie d'apprendre à faire quelque chose (style enfants éléments de stackpanel) donc ce serait un hack pour moi. On pourrait imaginer qu'il y a une troisième rangée de boîtes qui ont besoin d'être remplies de gris (pour, disons, faire un arc-en-ciel inversé). J'aimerais savoir comment le faire sans piratage (c.-à-d.créer un sous-type de rectangle spécial ou quelque chose dans cette plage) – DeveloperDoge

+0

Vous ne savez pas exactement ce que vous entendez par "hack". Pour le style des éléments enfants d'un élément parent, c'est le chemin. Sinon, vous devrez créer des styles avec un 'x: Key' dans un dictionnaire de ressources de premier niveau, et les affecter explicitement à la propriété' Style' d'un élément. – Clemens

+0

aaaah oui je viens de voir ce que vous vouliez dire, vous le faites dans StackPanel.Resources! Comment puis-je utiliser BasedOn = "..." ici pour l'incorporer au style ci-dessus. – DeveloperDoge

1

Vous pouvez définir une classe qui a une propriété Fill:

public class Item 
{ 
    public Brush Fill { get; set; } 
} 

et définir la propriété ItemsSource du ItemsControl à une collection de ces objets:

public partial class WindowRegenboog : Window 
{ 
    public WindowRegenboog() 
    { 
     InitializeComponent(); 
     DropZone.ItemsSource = new List<Item> { new Item { Fill = Brushes.Red }, new Item() { Fill = Brushes.Yellow } }; 
    } 
} 

Vous lient alors le Fill propriété du Rectangle dans le ItemTemplate à la propriété source Fill:

<ItemsControl Name="DropZone" HorizontalAlignment="Center"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Rectangle Fill="{Binding Fill}" Width="200" Height="200"/> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

De cette façon, vous pouvez changer la couleur Fill d'un Rectangle en définissant simplement la propriété Fill d'un élément dans la collection source à une brosse différente.

+0

J'apprécie l'effort et la liaison intelligente +1. Cependant, je vais accepter Clemens sa solution de meilleure pratique dans l'intérêt des autres. Je ne devrais pas avoir barboter avec ItemTemplates, ils ne fonctionnent pas comme prévu dans mon cas, compliquer les choses et le style même avec son bug de studio visuel sur les valeurs de gestionnaire, semble être une approche plus claire et plus nette. – DeveloperDoge

+0

+1? Vous semblez avoir oublié de voter. Quoi qu'il en soit, l'utilisation d'un style implicite ne fonctionnera pas si vous voulez pouvoir contrôler le remplissage de chacun des éléments Retangle séparément. Et en utilisant un ItemsControl avec un ItemTemplate et la liaison de données est la meilleure pratique lorsque vous travaillez avec n'importe quel type de collection d'éléments dans XAML. – mm8

+0

Eh bien maintenant mon cerveau (épuisé par un manque de sommeil), n'est pas en mesure de comprendre pleinement pourquoi votre approche serait meilleure. Dans la mesure où je comprends, vous créez une classe de fenêtre personnalisée et en quelque sorte une classe d'objet sans base/héritant/une seule propriété, alors vous faites 'DropZone.ItemsSource = new List {new Item {Fill = Brushes.Red}, nouvel élément() {Fill = Brushes.Yellow}}; '(les couleurs pourraient être rendues dynamiques plus tard), ce que je ne comprends pas complètement. Ce qui, dans mon humble expérience, me fait deviner qu'un grand nombre d'autres développeurs ne le feront pas, m'obligeant à enfiler le dangereux péril de l'apocalypse post-nucléaire en plaçant des non-KISS. – DeveloperDoge