1

我喜欢 IsMouseDirectlyOverChanged 的​​功能,但它只适用于最顶层的元素。我真正想做的是监视控件的 IsMouseOver 属性,而不考虑它的 z-index,并在 IsMouseOver 被修改时接收通知。如果我拥有这个属性,我可以执行 INotifyPropertyChanged,但不幸的是它归 UIElement 所有。仍在学习 WPF 的原理,所以这可能很容易,但我不熟悉如何监视属于父类的属性。与 IsMouseDirectlyOver 不同,IsMouseOver 没有附加更改事件。

4

2 回答 2

2

我看到有一个公认的解决方案,我只是想分享我的意见。在我的情况下,我在用户控件中有一个标签,我需要对鼠标结束做出反应。对我来说,MouseEnter 和 MouseLeave 事件会触发,所以我可以处理它们。我在后面的代码中定义了标签(因为我以编程方式将它放在运行时)并且刚刚添加了标签对象的标准事件。IsMouseDirectlyOverChanged 对我不起作用,因为我将鼠标悬停在用户控件上。如果有另一个 Control 重叠,这也有效。因此,也许这不适合您的情况,也许确实如此 :-)
我也想粘贴 xaml,但似乎我没有得到降价的东西 :-)

...
    Private Sub Rectangle1_MouseEnter(sender As Object, e As System.Windows.Input.MouseEventArgs) 处理 Rectangle1.MouseEnter, Rectangle2.MouseEnter
        Dim s As Rectangle = 发件人
        s.Fill = Brushes.Red
    结束子

    Private Sub Rectangle1_MouseLeave(sender As Object, e As System.Windows.Input.MouseEventArgs) 处理 Rectangle1.MouseLeave, Rectangle2.MouseLeave
        Dim s As Rectangle = 发件人
        s.Fill = Brushes.Green
    结束子
...

BR, D

于 2013-10-16T17:27:21.810 回答
1

您可以使用样式对 IsMouseOver 更改时做出反应。

<Window.Resources>
     <Style x:Key="RectStyle" TargetType="Rectangle">
          <Style.Triggers>
               <Trigger Property="IsMouseOver" Value="True">
                    <!-- react to property change here -->
               </Trigger>
          </Style.Triggers>
     </Style>
 </Window.Resources>

然后将样式附加到元素上:

<Rectangle Style="{StaticResource RecStyle}" Width="100" Height="100" Fill="Black" />

编辑:

如果您想从样式中调用代码,则解决方案相当复杂。

首先,您必须创建一个自定义 UserControl 类并为其提供附加属性。每当附加属性发生更改时,您都可以使用属性更改回调。这是*.xaml.cs文件,只保留默认.xaml文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ExampleApp
{
    /// <summary>
    /// Interaction logic for MouseOverWrapper.xaml
    /// </summary>
    public partial class MouseOverWrapper : UserControl
    {

        public static readonly DependencyProperty MouseIsOverProperty;

        static MouseOverWrapper()
        {
            MouseIsOverProperty = DependencyProperty.RegisterAttached(
                "MouseIsOver", typeof(bool), typeof(MouseOverWrapper),
                new FrameworkPropertyMetadata(false, OnMouseIsOverChanged));
        }

        public static bool GetMouseIsOver(UIElement element)
        {
            return (bool)element.GetValue(MouseIsOverProperty);
        }

        public static void SetMouseIsOver(UIElement target, bool value)
        {
            target.SetValue(MouseIsOverProperty, value);
        }

        private static void OnMouseIsOverChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            // handle code here. example:
            if ((bool)e.NewValue == true)
                ((Rectangle)d).Fill = Brushes.Yellow;
            else
                ((Rectangle)d).Fill = Brushes.Black;
        }

        public MouseOverWrapper()
        {
            InitializeComponent();
        }
    }
}

然后,您必须将要响应的元素包装在自定义控件中,并使样式更改该自定义控件的附加属性。例子:

<Window x:Class="ExampleApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ExampleApp"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style x:Key="RecStyle" TargetType="Rectangle">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="local:MouseOverWrapper.MouseIsOver" Value="True" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <local:MouseOverWrapper>
        <Rectangle Style="{StaticResource RecStyle}" Width="100" Height="100" Fill="Black" />
    </local:MouseOverWrapper>
</Window>

将所有代码添加到OnMouseOverIsChanged函数中,这应该可以工作。

于 2012-06-11T19:15:41.753 回答