Domanda

Devo impostare una proprietà di dipendenza su un controllo (Slider.Value) nel mio codice senza che venga attivato un evento ValueChanged (poiché ho impostato il valore, non l'utente). Qual è il modo migliore per gestire questa situazione in WPF?

Per chiarimenti, quello che sto cercando di fare è collegare i cursori WPF a un controllo utente di WinForms. Attualmente nella mia app ho un gestore eventi ValueChanged che passa il valore del dispositivo di scorrimento al controllo WinForms tramite una chiamata di metodo. Il controllo WinForms (che in realtà è un wrapper attorno a una finestra OpenGL nativa) deve essere in grado di modificare dinamicamente il dispositivo di scorrimento in base ai suoi calcoli interni. Per fare ciò utilizzo un'astrazione di un dispositivo di scorrimento (ISlider), istanzio un sapore WPF di quel dispositivo di scorrimento nella mia app e passo un handle alla sua base al controllo WinForms tramite una proprietà .NET sul controllo utente di WinForms. Tutto questo al momento funziona, è solo che quando la logica interna decide che il dispositivo di scorrimento deve cambiare, chiama ISlider :: SetPos (), che quindi cambia il dispositivo di scorrimento WPF, che quindi attiva un evento ValueChanged sul dispositivo di scorrimento e il gestore per quell'evento estrae la posizione del cursore e lo passa al controllo WinForms che ha originato l'evento in primo luogo. I suggerimenti di Ligaz e Alan Le sembrano entrambi dovrebbero funzionare, ma non sono sicuro che lo farò nel migliore dei modi.

È stato utile?

Soluzione

Ecco una soluzione alternativa / hack. Aggiungi un valore booleano per tenere traccia della modifica dell'impostazione, diciamo " IsChangedByMe " ;. Quando si modifica la proprietà di dipendenza nel codice, impostare bool su true. Nell'evento ValueChanged, se IsChangedByMe è true, non eseguire alcuna operazione.

Altri suggerimenti

Sei sicuro di voler davvero farlo? Se esiste una parte del database UI in quella proprietà e permetti di cambiare il valore senza innescare l'evento ValueChanged, finiresti rapidamente con la tua UI non più sincronizzata con i dati.

Nel caso del dispositivo di scorrimento, immagina che l'utente lo collochi al 75%. Ora il tuo codice lo cambia al 10% in background ma elimina la notifica di modifica. Sembra ancora sullo schermo come al 75% (poiché non gli è stato detto che è cambiato), ma viene utilizzato come 10% dal codice in esecuzione. Sembra una ricetta per la confusione.

Una possibile soluzione è derivare da Slider e sovrascrivere OnValueChanged (...) . Quando non volevi organizzare l'evento, non dovresti fare nulla, altrimenti dovresti chiamare l'implementazione di base.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top