4

J'ai un énorme problème que je ne peux pas comprendre. Disons que j'ai cinq fruits différents, et je veux que chacun d'eux soit associé à une certaine couleur. Disons que j'ai trois "paniers" qui contiennent zéro ou plus de ces fruits.Silverlight Toolkit; Couleurs de camembert

Lorsque je crée des camemberts pour mes trois paniers, chaque coin est juste une couleur aléatoire qui peut être choisie par le contrôle. Comment pourrais-je dire, faire les bleuets bleu, bannanas jaune, etc. dans le tableau?

Je sais que c'est une question étrange, mais je ne peux pas penser à une façon plus simple de le décrire.

Je me fiche de savoir si la solution est en code XAML ou code, aussi longtemps que cela fonctionne.

Répondre

5

J'ai trouvé la solution, après beaucoup de jurons et d'enquête. Il y a beaucoup de pièces mobiles ici, donc je vais les garder aussi brèves que possible tout en transmettant les points principaux.

Pour commencer j'ai une collection d'objets que je suis en train de suivre:

public class PileOfFruit 
{ 
    public string Name {get; set; } 
    public int Count { get; set; } 
} 

Dans mon modèle de vue, j'ai une collection de ces objets. À mon avis, je vais définir le camembert qui affichera les quantites des fruits dans le panier. Le facteur le plus important est le modèle ici se liant à SliceTemplate

<chartingToolkit:Chart x:Name="ExampleChart"> 
    <chartingToolkit:PieSeries ItemsSource={Binding FruitBasket 
           DependentValueBinding="{Binding Count}" 
           IndependentValueBinding="{Binding Name}"> 
     <chartingToolkit:PieSeries.Palette> 
      <visualizationToolkit:ResourceDictionaryCollection> 
      <ResourceDictionary> 
       <Style x:Key="DataPointStyle" TargetType="Control"> 
        <Setter Property="Template" Value="{StaticResource SliceTemplate}"/> 
       </Style> 

maintenant dans app.xaml ou un autre endroit où nous pouvons déposer dans le modèle de l'objet PieDataSeries. Portez une attention particulière à la valeur sur Remplissez Il est lié à la valeur indépendante qui sera quelque chose comme «banane» «raisin» ou autre. Celui-ci est transmis à un convertisseur de valeur.

<converters:FruitToColorConverter x:Key="FruitToColorConverter"/> 

<ControlTemplate x:Key="SliceTemplate" TargetType="chart:PieDataPoint"> 
    <Path Data="{TemplateBinding Geometry}" 
     Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IndependentValue, Converter={StaticResource FruitToColorConverter}}" 
     Stroke="{TemplateBinding BorderBrush}"> 
    .... 

Le convertisseur de données associé est ce qui va finalement définir la couleur que nous désirons. Donc, si nous faisons quelque chose comme ça ...

public class FruitToColorConverter : IValueConverter 
{ 
    private SolidColorBrush Default = new SolidColorBrush(Colors.Black); 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    if (value == null || (!(value is string))) { return Default; } 

    switch (value as string) 
    { 
     case "Apple": 
     return new SolidColorBrush(Colors.Red); 
     case "BlueBerry": 
     return new SolidColorBrush(Colors.Blue); 
     default: 
     return Default; 
     ...... 

Et c'est ainsi que vous obtenez les bonnes couleurs à chaque fois. Si j'ai oublié quelque chose ou si je devrais clarifier, s'il vous plaît faites le moi savoir afin que je puisse apporter des corrections. Il y a beaucoup de pièces mobiles ici .. = P

3

Vous pouvez définir votre propre palette de couleurs pour le graphique, mais elle sélectionnera automatiquement les couleurs pour les données telles qu'elles apparaissent dans la palette. Donc, pas moyen (facile?) De dire au tableau d'afficher des bleuets bleus, des bananes jaunes, etc. Ce que vous pouvez faire est de dire au graphique d'afficher le premier élément bleu, deuxième élément jaune etc, et mettre les bleuets d'abord, bannanas deuxième etc. dans la source de données.

Certains échantillons pour définir votre propre Paletta:

<chartingToolkit:Chart x:Name="ExampleChart"> 
    <chartingToolkit:PieSeries> 
     <chartingToolkit:PieSeries.ItemsSource > 
      <toolkit:ObjectCollection> 
       <sys:Double>1</sys:Double> 
       <sys:Double>2.3</sys:Double> 
       <sys:Double>3.5</sys:Double> 
       <sys:Double>5</sys:Double> 
      </toolkit:ObjectCollection> 
     </chartingToolkit:PieSeries.ItemsSource > 
     <chartingToolkit:PieSeries.Palette> 
      <visualizationToolkit:ResourceDictionaryCollection> 
      <ResourceDictionary> 
       <Style x:Key="DataPointStyle" TargetType="Control"> 
        <Setter Property="Background" Value="Red"/> 
       </Style> 
      </ResourceDictionary> 
      <ResourceDictionary> 
       <Style x:Key="DataPointStyle" TargetType="Control"> 
        <Setter Property="Background" Value="Green"/> 
       </Style> 
      </ResourceDictionary> 
      <ResourceDictionary> 
       <Style x:Key="DataPointStyle" TargetType="Control"> 
        <Setter Property="Background" Value="Blue"/> 
       </Style> 
      </ResourceDictionary> 
      </visualizationToolkit:ResourceDictionaryCollection> 
     </chartingToolkit:PieSeries.Palette> 
    </chartingToolkit:PieSeries > 
</chartingToolkit:Chart > 

EDIT: Les namespeces intéressants:

xmlns:visualizationToolkit="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
+0

Re: espaces de noms. Il suffit d'utiliser xmlns: toolkit = "http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" ayant tous ces différents alias est donc SL3 – AnthonyWJones

+1

J'ai essayé cette approche, mais si le graphique est rechargé pour Pour une raison quelconque, l'ordre des couleurs ne commence pas à # 1, car ils sont sélectionnés dans un "round robin fashion". –

-1

Voici ce que j'ai trouvé: Les couleurs ne sont pas vraiment aléatoires: Il y a un séquencement de palettes qui se répète toutes les 5 fois (le nombre ne fait pas vraiment) t matière).Ma solution de contournement est plus simple: chaque fois que j'ai de nouvelles données à afficher, je recréer le diagramme. De cette façon, la palette de couleurs commencera toujours à partir des mêmes couleurs (ce qui signifie qu'elle ne changera jamais). Cela signifie que vous devez avoir une méthode qui reconstruit par programme votre PieChart (ne l'avez pas en XAML, il suffit d'avoir un espace réservé et d'appeler la méthode "PieChartBuilder"). Je pense que c'est moins de code (aussi moins de bugs :)).

+1

Vous n'avez toujours pas de contrôle sur les couleurs. Le simple fait de créer un nouveau graphique chaque fois que les données changent est un hack stupide. En outre, s'il existe plusieurs diagrammes à secteurs, votre méthode échouera à nouveau. En outre, si l'ordre/nombre d'éléments dans les graphiques sont différents. Je pourrais continuer encore et encore. –

Questions connexes