2011-06-14 9 views
8

Tengo un ComboBox. Sin cambiar la plantilla, ¿hay alguna forma de que pueda iniciar código cuando el usuario coloca su mouse sobre un ComboBoxItem, pero antes de que la selección realmente ocurra? Parece que debería poder especificar un EventTrigger o un Trigger para hacer esto en el estilo de ComboBoxItem.WPF: Código de inicio cuando IsMouseOver ComboBoxItem

<ComboBox Grid.Column="1" Grid.Row="0" 
      ItemsSource="{Binding Voices}"         
      SelectedItem="{Binding SelectedVoice, Mode=TwoWay}"> 
    <ComboBox.Resources> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        ... Launch my code from code behind... but HOW? ... 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.Resources> 
</ComboBox> 

también estoy bien con una V IVIENDA MouseEnter, pero yo preferiría no construir un DataTemplate separado o ContentTemplate si es posible.

Actualización. La idea detrás de este fragmento es Reproducir audio de prueba cuando el usuario pasa el mouse sobre una nueva voz, lo que tendría que hacer desde el lado del código. ¡Ayuda!

+0

¿Cómo se maneja el caso de un usuario mueve el ratón sobre los dos primeros puntos, mientras que ir a la tercera? ¿Tocarás los dos primeros sonidos? –

+0

el código real desencadenará un hilo con thread.sleep que espera quizás 100-200 ms para asegurarse de que el usuario todavía está en el mismo elemento, en este caso, comprobará si ismouseover sigue siendo verdadero – tofutim

+0

No es una respuesta a su pregunta, pero dos sugerencias para realizar su idea: para reproducir algo de audio en algún evento, use junto con la clase . Alternativamente, use una clase y maneje los eventos del mouse. –

Respuesta

4

Puedes usar EventSetter:

<ComboBox.Resources> 
    <Style TargetType="{x:Type ComboBoxItem}"> 
     <EventSetter Event="PreviewMouseMove" Handler="ComboBoxItem_PreviewMouseMove" /> 
    </Style> 
</ComboBox.Resources> 

en código detrás:

private void ComboBoxItem_PreviewMouseMove(object sender, MouseEventArgs e) 
{ 
    ComboBoxItem item = sender as ComboBoxItem; 
    //Now you can use this Item 
} 
+0

Oye, esto podría funcionar. – tofutim

+0

Sí, funciona para mí –

0

sé una solución sucia .. en caso de que se quede sin soluciones intenta esto como su última esperanza ..

He probado esto mediante la creación de un textblock en XAML y el establecimiento de su text igual a content de comboboxitem vez mouse es over y establecer text a "" vez mouse tiene left

estoy usando AttachedBehaviours para averiguar sobre la cual es determinada comboboxitemmouse over vez ratón está allí y también conseguir notificado una vez que el ratón no está sobre ella más o ratón se deja

probar este .. crear una clase

public static class ComboBoxBehaviour 
    { 
     //holding reference of MainWindow class to update the textBlock 
     public static MainWindow windoewRef ; 

     public static bool GetTest(ComboBoxItem target) 
     { 
      return (bool)target.GetValue(TestAttachedProperty); 
     } 

     public static void SetTest(ComboBoxItem target, bool value) 
     { 
      target.SetValue(TestAttachedProperty, value); 
     } 

     public static readonly DependencyProperty TestAttachedProperty = DependencyProperty.RegisterAttached("Test", typeof(bool), typeof(ComboBoxBehaviour), new UIPropertyMetadata(false, OnMouseOverChanged)); 

     static void OnMouseOverChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
     { 
      ComboBoxItem item = o as ComboBoxItem; 
      if ((bool)e.NewValue) 
      { 
       // I am setting text of a textblock for testing once mouse is over an item 
       windoewRef.textBlock.Text = item.Content.ToString(); 
      } 
      else 
      { 
       //setting text to "" once mouse has been moved 
       windoewRef.textBlock.Text = ""; 
      } 
     } 
    } 

En XAML

<TextBlock Text="" x:Name="textBlock" /> 
     <ComboBox x:Name="combo"> 

      <ComboBox.Resources> 
       <Style TargetType="{x:Type ComboBoxItem}" xmlns:behaviours="clr-namespace:WpfApplication1"> 
        <Style.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="behaviours:ComboBoxBehaviour.Test" Value="True"/> 
         </Trigger> 
         <Trigger Property="IsMouseOver" Value="False"> 
          <Setter Property="behaviours:ComboBoxBehaviour.Test" Value="False"/> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </ComboBox.Resources> 
     </ComboBox> 

Sé que esto es una mala solución y puede tener problemas que no he encontrado aún, pero solo mis pensamientos ...

+0

Jaja, eso es bastante sucio, pero aprecio la solución. ;) Ciertamente, una forma es volver a crear la plantilla Contenido o Datos. – tofutim

Cuestiones relacionadas