1

IsMouseDirectlyOverChanged の機能は気に入っていますが、最上位の要素に対してのみ機能します。私が本当にやりたいことは、コントロールの IsMouseOver プロパティをその z-index に関係なく監視し、IsMouseOver が変更されたときに通知を受け取ることです。このプロパティを所有していれば INotifyPropertyChanged を実行できますが、残念ながら UIElement が所有しています。まだ WPF のロープを学んでいるので、これは簡単かもしれませんが、親クラスに属するプロパティを監視する方法に慣れていません。IsMouseDirectlyOver とは異なり、IsMouseOver には changed イベントが添付されていません。

4

2 に答える 2

2

受け入れられた解決策があるようです。私の意見を共有したかっただけです。私の場合、ユーザーコントロールにラベルがあり、マウスが終わったときに反応する必要がありました。私にとっては、MouseEnter および MouseLeave イベントが発生するので、それらを処理できます。Code Behind でラベルを定義し (実行時にプログラムで配置するため)、ラベル オブジェクトの標準イベントを追加しました。IsMouseDirectlyOverChanged は、ユーザーコントロールの上にカーソルを置いているため、うまくいきませんでした。これは、別のコントロールが重なっている場合にも機能します。したがって、これはあなたの状況に合わないかもしれませんが、そうかもしれません:-)
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 に答える