WPF: запуск кода, когда IsMouseOver ComboBoxItem - PullRequest
8 голосов
/ 14 июня 2011

У меня есть ComboBox. Не меняя шаблон, есть ли способ, с помощью которого я могу запустить код, когда пользователь наводит указатель мыши на ComboBoxItem, но до того, как выбор действительно произойдет? Похоже, я должен быть в состоянии указать EventTrigger или Trigger, чтобы сделать это в стиле 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>

Я также согласен с использованием MouseEnter, но я бы не стал создавать отдельный DataTemplate или ContentTemplate, если это возможно.

Обновление. Идея этого фрагмента состоит в том, чтобы воспроизводить тестовое аудио, когда пользователь наводит курсор на новый голос, что я должен был бы сделать со стороны кода. Помогите!

Ответы [ 2 ]

4 голосов
/ 14 июня 2011

Вы можете использовать EventSetter:

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

в коде:

private void ComboBoxItem_PreviewMouseMove(object sender, MouseEventArgs e)
{
    ComboBoxItem item = sender as ComboBoxItem;
    //Now you can use this Item
}
0 голосов
/ 14 июня 2011

Я знаю грязное решение ... на случай, если у вас закончатся решения, попробуйте это как свою последнюю надежду ..

Я проверил это, создав textblock в XAML и установив его text равным content из comboboxitem один раз mouse равно over его и установив text в "" один раз mouse имеет left

Я использую AttachedBehaviours, чтобы выяснить, на каком конкретном comboboxitem стоит mouse over, когда мышь есть, а также получать уведомления, когда мышь больше не находится над ней или мышь не оставили

Попробуйте это .. создать класс

 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 = "";
            }
        }
    }

в 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>

Я знаю, что это плохое решение, и у него могут быть проблемы, которых я еще не нашел, но только мои мысли ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...