WPF:当IsMouseOver ComboBoxItem时启动代码

本文关键字:启动 代码 ComboBoxItem IsMouseOver WPF | 更新日期: 2023-09-27 17:59:19

我有一个组合框。在不更改模板的情况下,有没有一种方法可以在用户将鼠标放在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。

更新这个片段背后的想法是当用户悬停在一个新语音上时播放测试音频,我必须从代码端进行。帮助

WPF:当IsMouseOver ComboBoxItem时启动代码

您可以使用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
}

我知道一个肮脏的解决方案。。万一你的解决方案用完了,试着把它作为你最后的希望。。

我在XAML中创建了一个textblock,并在mouseover时将其text设置为comboboxitemcontent,在mouseleft 时将text设置为""

我正在使用AttachedBehaviours来找出哪个特定的comboboxitemmouse 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>

我知道这是一个糟糕的解决方案,它可能有我还没有发现的问题,但只是我的想法。。。