IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

WPF Thread UI sur dependency property change [Débutant]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Par défaut WPF Thread UI sur dependency property change
    Bonjour,

    je bloque actuellement sur une modification UI qui refuse de se faire sur le thread UI. J'ai développé un user control comprenant une toolbar et un RichTextBox. Je voudrais pouvoir utiliser ce control de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <local:RichTextEditorUC Height="265" Margin="0,10,0,0" Document="{Binding ElementName=MusicalGenreComboBox, Path=SelectedItem.Description, UpdateSourceTrigger=PropertyChanged}"/>
    J'ai donc ajouté une dependency propertie à mon user control pour faire le lien avec la propriété 'Document' du RichTextBox. Et dans le callback de cette property je voudrais mettre à jour la valeur 'document' du RichTextBox comme ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     public static readonly DependencyProperty DocumentProperty = DependencyProperty.Register("Document", typeof(FlowDocument),
                typeof(RichTextEditorUC), new PropertyMetadata(OnDocumentChanged));
     
            private static void OnDocumentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
                App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => {
                    RichTextEditorUC editor = (RichTextEditorUC) d;
                    editor.RichText.Document = (e.NewValue == null) ? new FlowDocument() : (FlowDocument) e.NewValue;
                }));
            }
    L'affectation du 'FlowDocument' me lève une 'InvalidOperationException' avec le message suivant: Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.

    Pourriez-vous m'expliquer mon erreur et comment y remédier svp

  2. #2
    Membre confirmé
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Par défaut
    Seul le thread UI a le droit de modifier les propriétés d'un élément graphique (dont les user control donc).

    Pour invoquer le thread UI, tu peux utiliser la propriété Dispatcher de ton controle.

    Essayes de remplacer App.Current.Dispatcher.BeginInvoke par d.Dispatcher.BeginInvoke.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Par défaut
    Merci Alucia pour ta réponse.

    Effectivement après plusieurs lectures je m'aperçois que tu as entièrement raison, seul le thread UI peut modifier les propriétés d'un élément graphique.

    Malheureusement la modification suggérée ne règle pas le problème, j'obtiens la même erreur. je ne vois pas comment me synchroniser avec le thread UI pour effectuer cette modification.

  4. #4
    Membre confirmé
    Femme Profil pro
    Etudiante en Développement
    Inscrit en
    Avril 2012
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en Développement
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 106
    Par défaut
    Et en mettant directement Dispatcher.BeginInvoke ?

    Comme ta DependencyProperty est déclarée dans code-behind de ton user control, la propriété Dispatcher devrait être accessible et doit normalement faire référence au Dispatcher associé à ce control (je me trompe peut-être, je ne suis pas une experte )

    Si ça ne passe toujours pas, ce n'est peut-être pas l'affectation de la propriété Document qui plante mais l'accès au FlowDocument à travers e.NewValue ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Par défaut
    Même combat. Ton idée sur le FlowDocument est peut être à creuser. Dans l'interface j'utilise cet dependency property sur du binding.

    En substance j'ai une ComboBox et cette dependency prend pour valeur une propriété de l'objet selected de la Combo. Cet objet possède une propriété FlowDocument.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Par défaut
    Bien j'ai enfin fini par trouvé une solution acceptable.

    Donc j'ai un CustomUserControl qui englobe une toolbar et un RichTtextBox. Ce control possède une dependency property de type FlowDocument qui lors du set ne cherche plus à modifier la propriété Document du RichTextBox mais set la propriété FlowDocument du viewModel associé au user control.

    Ensuite je remplace le RichTextBox par un control en dérivant et permettant le binding. C'est assez simple il suffit de créer une dependency property dans l'objet dérivé.

    Puis dans le custom user control je bind la propriété Document du BindableRichTextBox sur la propriété FlowDocument du viewModel.

    et voilà

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. WPF - Dependency property sans callback
    Par superbobo dans le forum WinRT
    Réponses: 0
    Dernier message: 06/01/2015, 18h03
  2. [WPF 4]Dependency Property non trouvée dans le designer
    Par MacReiben dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 25/08/2011, 10h30
  3. Bind d'une textbox d'une usercontrol sur une Dependency property
    Par Yogy dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 27/04/2010, 05h26
  4. Problème de thread et de dependency property
    Par kite37 dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 06/10/2009, 16h55
  5. plusieurs threads ecrivent sur la meme socket
    Par estergiou dans le forum C++
    Réponses: 3
    Dernier message: 04/11/2005, 01h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo