2014-09-16 2 views
1

J'ai cette classe de modèle où j'utilise DataContract pour désérialiser les données reçues du serveur. Donc, il a ces deux champs Data et DataColorData est envoyé à partir du serveur et DataColor en est dérivé en utilisant une certaine logique.Accès à l'accès croisé non valide

ModelClass.cs

private double _data; 
    [DataMember(Name = "data")] 
    public double Data 
    { 
     get { return this._data; } 
     set 
     { 
      SetField(ref _data, value, "Data"); 
      this.DataColor = Util1.GetColorFromData(value); 
     } 
    } 

    private SolidColorBrush _dataColor; 
    public SolidColorBrush DataColor 
    { 
     get { return this._dataColor; } 
     set { SetField(ref _dataColor, value, "DataColor"); } 
    } 

Pour définir DataColor J'appelle une de mes fonctions de classe Util1.

Util1.cs

public static SolidColorBrush GetColorFromData(double data) 
    { 
     // apply some logic to get hexColor from data 
     return Util2.GetSolidColorFromHex(string hexColor); 
    } 

qui appelle à son tour une autre classe fonction Util2 pour convertir hexColor-SolidColorBrush

Util2.cs

GetSolidColorFromHex(string hexColor) 
    { 
     return new SolidColorBrush(
      Color.FromArgb(
       255, 
       Convert.ToByte(hexaColor.Substring(1, 2), 16), 
       Convert.ToByte(hexaColor.Substring(3, 2), 16), 
       Convert.ToByte(hexaColor.Substring(5, 2), 16) 
      )); 
    } 

Maintenant, je n » Je n'ai même pas la moindre idée de pourquoi je reçois ça 0 Erreurdans Util2.cs lorsque j'essaie de créer l'objet SolidColorBrush. Je n'essaie pas de changer un objet d'interface utilisateur ici.

Je pensais utiliser Deployment.Current.Dispatcher.BeginInvoke() ici, mais puisque je renvoie des valeurs de la fonction ici, je ne peux pas utiliser Dispatcher je pense.

J'ai besoin de savoir pourquoi ai-je cette erreur et comment puis-je résoudre ce problème?

J'ai perdu beaucoup de temps à ce sujet et j'ai essayé de déplacer GetSolidColorFromHex de Util2 à Util1. Toujours pas de succès.

Il n'y a pas non plus de manière générale d'éviter Invalid cross thread en passant du contexte ou quelque chose d'autre peut-être.

Merci

Répondre

1

Bien que vous n'êtes pas essayer de modifier les propriétés de l'interface utilisateur, un SolidColorBrush ne peuvent être instanciés sur le thread d'interface utilisateur.

Vous pouvez faire la création sur le thread UI pour créer une variable privée du pinceau, puis le renvoyer.

Edit:

Sans être à un PC pour confirmer, je crois quelque chose comme ça fonctionnerait:

GetSolidColorFromHex(string hexColor) 
{ 
    SolidColorBrush brush; 
    Deployment.Current.Dispatcher.BeginInvoke(
     () => brush = new SolidColorBrush(
      Color.FromArgb(
       255, 
       Convert.ToByte(hexaColor.Substring(1, 2), 16), 
       Convert.ToByte(hexaColor.Substring(3, 2), 16), 
       Convert.ToByte(hexaColor.Substring(5, 2), 16) 
     ))); 

    return brush; 
} 
+0

Oh. Mais n'y a-t-il pas d'autre alternative. Ce que j'obtiens de votre réponse, c'est que je devrais déplacer la logique de Util1 et Util2 vers un thread d'interface utilisateur comme MainPage.xaml.cs et l'appeler depuis ModelClass.cs. S'il vous plait corrigez moi si je me trompe. – PratPor

+0

@PratPor J'ai mis à jour ma réponse avec un exemple – Joeb454

+1

Je trouve cela assez surprenant. Les objets Afaik sont supposés être instanciables à partir d'autres threads, figés, puis envoyés au thread où ils seront utilisés (cela fonctionne pour les images figées). De toute façon ne pouvez-vous pas simplement travailler avec une simple couleur, plutôt que d'un pinceau? Ou peut-être pouvez-vous créer un second répartiteur sur votre autre thread? Je suppose que cela fonctionnerait. –

Questions connexes