2010-10-22 6 views
5

J'ai remplacé les rubans WPF par la nouvelle librairie, la sélection de la liste déroulante modifiée a déclenché le rechargement de datagrid. J'ai un problème avec le RibbonComboBox.RibbonComboBox l'élément de la galerie sélectionnée revient à l'ancienne valeur de la souris

Si je pars avec le curseur de souris hors de l'élément sélectionné, l'élément sélectionné est ramené à l'ancien élément. Si je garde le curseur sur l'élément sélectionné jusqu'à ce que le rechargement de DataGrid soit terminé, la nouvelle valeur est acceptée dans le ribboncombobox. Est-ce que je manque une propriété ribboncombobox spéciale pour accepter la modification en cliquant seulement ou c'est un bug dans le composant combobox? Seule solution de contournement possible serait le lancement de la fonction de rechargement de DataGrid dans le thread pour permettre à la zone de liste déroulante de terminer ses processus.

exemple de code ici:

<r:RibbonComboBox> 
     <r:RibbonGallery SelectedValuePath="Content" SelectionChanged="pgSize_SelectionChanged"> 
     <r:RibbonGalleryCategory> 
      <r:RibbonGalleryItem Tag="20" Content="Size (20)" Foreground="Green" /> 
      <r:RibbonGalleryItem Tag="30" Content="Size (30)" Foreground="Green" IsSelected="True"/> 
      <r:RibbonGalleryItem Tag="50" Content="Size (50)" Foreground="Orange" /> 
      <r:RibbonGalleryItem Tag="100" Content="Size (100)" Foreground="Red" /> 
     </r:RibbonGalleryCategory> 
     </r:RibbonGallery> 
</r:RibbonComboBox>  

Répondre

0

Voici une solution de contournement (.Net 4.0), basée sur la solution de contournement fournie dans le Connect Bug.

Je vous ai trouvé seulement besoin du Mouse.Capture(null) sur l'événement SelectionChanged:

<ribbon:RibbonComboBox> 
    <ribbon:RibbonGallery SelectedItem="{Binding X}" 
          DisplayMemberPath="Name" 
          SelectionChanged="RibbonGallery_SelectionChanged"> 
     <ribbon:RibbonGalleryCategory ItemsSource="{Binding Y}" 
             DisplayMemberPath="Name" /> 
    </ribbon:RibbonGallery> 
</ribbon:RibbonComboBox> 

Avec le code suivant derrière:

void RibbonGallery_SelectionChanged(
    object sender, 
    RoutedPropertyChangedEventArgs<object> e) 
{ 
    Mouse.Capture(null); 
} 

Ou, comme une classe dérivée:

/// <summary> 
/// Fixes a known issue with the <see cref="RibbonGallery"/>. 
/// </summary> 
/// <remarks> 
/// See <a href="https://connect.microsoft.com/VisualStudio/feedback/details/666352/">Allow users to move mouse after selecting an item in WPF RibbonComboBox</a>. 
/// </remarks> 
public class RibbonGalleryEx : RibbonGallery 
{ 
    public RibbonGalleryEx() 
    { 
     this.SelectionChanged += (sender, e) => Mouse.Capture(null); 
    } 
}