penso che potrei aver trovato una soluzione. I combobox hanno un evento DropDownClosed - il problema è che non si tratta di un oggetto RoutedEvent, quindi non è possibile creare uno stile per i ComboBox e far sì che tutti ereditino l'evento tramite un EventSetter. (È possibile ottenere l'errore 'DropDownClosed' must be a RoutedEvent registered with a name that ends with the keyword "Event"
)
Tuttavia, il Loaded
evento è un RoutedEvent, in modo che possiamo collegare in che nello stile:
<Style x:Key="ComboBoxCellStyle" TargetType="ComboBox">
<EventSetter Event="Loaded" Handler="ComboBox_Loaded" />
</Style>
Ora che abbiamo un evento che sarà attivo sempre, prima di Tutto il resto è fatto con la ComboBox, siamo in grado di agganciare in caso abbiamo effettivamente a cuore:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).DropDownClosed -= ComboBox_OnDropDownClosed;
((ComboBox)sender).DropDownClosed += new System.EventHandler(ComboBox_OnDropDownClosed);
}
Ora che ho finalmente l'accesso alla manifestazione che viene generato quando la discesa si sta chiudendo, Sono in grado di eseguire tutte le azioni necessarie per assicurarmi che il focus sia terminato sul fastidioso ComboBox. Nel mio caso, il seguente:
void ComboBox_OnDropDownClosed(object sender, System.EventArgs e)
{
FrameworkElement visualElement = (FrameworkElement)sender;
while(visualElement != null && !(visualElement is DataCell))
visualElement = (FrameworkElement)visualElement.TemplatedParent;
if(visualElement is DataCell)
{
DataCell dataCell = (DataCell)visualElement;
dataCell.EndEdit();
if(!(dataCell.ParentRow is InsertionRow)) dataCell.ParentRow.EndEdit();
}
}
Ho avuto un ComboBox come modello di una DataCell in un GridView, e questo particolare problema è stato impedendo il DataRow di finire modifica quando l'utente si aprì una casella combinata poi cliccato al di fuori di la griglia.
Questo è stato il mio più grande problema con questo bug.Un problema secondario che impostava lo stato attivo in questo evento iff l'utente ha fatto clic. Anche la casella combinata potrebbe essere stata chiusa solo perché l'utente ha colpito la scheda o l'escape, quindi non possiamo semplicemente impostare la messa a fuoco sulla posizione del mouse. Avremmo bisogno di maggiori informazioni su cosa ha causato l'evento DropDownClosed. Probabilmente significa aggancio ad altri eventi non alterati nel gestore di eventi _Loaded.
Ciao @Alain, il problema qui è che stai cercando di deviare dal solito comportamento di un controllo standard .. Anche se pensi che sia meglio farlo nel modo in cui descrivi, sarà incoerente con il modo in cui le persone vengono utilizzate alle combobox che funzionano, che nella maggior parte dei casi è una cattiva idea. – joshuahealy
Il vero problema è che l'utente si lamenta di "aver bisogno di fare clic due volte prima che l'interfaccia utente risponda dopo aver visualizzato un elenco di caselle combinate". Se torno indietro all'utente e gli dico che è di design, troveranno un altro designer. – Alain
Ecco perché ho detto nella maggior parte dei casi ... come tutti abbiamo avuto a che fare con i clienti prima ... Speriamo che un guru del WPF possa aiutare! – joshuahealy