在任何应用场所滚动都应该导致最后使用的组合框滚动

时间:2014-07-11 06:49:23

标签: c# wpf scroll mousewheel

我想添加到我的应用程序中,当我在应用程序的任何地方使用鼠标滚轮时,应该在最后一个活动组件或最后使用的组合框中滚动。

你能帮帮我吗?我该怎么办呢。

非常感谢。

1 个答案:

答案 0 :(得分:1)

以下是我尝试解决问题的两种方法

方法1:附加属性

我创建了一个MouseExtension类,Attached Property ScrollAnywhere,可以在应用程序的任何元素上启用行为。您可以选择具有不同的可滚动区域,因此当鼠标位于各自的区域时,可以滚动不同的组合框。您可能有一个子区域,仅对其子控件具有此行为。可能性是无限的。

此方法也使其可注射

例如

<Window x:Class="CSharpWPF.View" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:CSharpWPF"
        Title="MainWindow"
        l:MouseExtension.ScrollAnywhere="true">
    ...
</Window>

我已设置属性l:MouseExtension.ScrollAnywhere="true"以启用行为

namespace CSharpWPF
{
    class MouseExtension : DependencyObject
    {
        public static bool GetScrollAnywhere(DependencyObject obj)
        {
            return (bool)obj.GetValue(ScrollAnywhereProperty);
        }

        public static void SetScrollAnywhere(DependencyObject obj, bool value)
        {
            obj.SetValue(ScrollAnywhereProperty, value);
        }

        // Using a DependencyProperty as the backing store for ScrollAnywhere.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ScrollAnywhereProperty =
            DependencyProperty.RegisterAttached("ScrollAnywhere", typeof(bool), typeof(MouseExtension), new PropertyMetadata(false, OnScrollAnywhere));

        private static void OnScrollAnywhere(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            UIElement element = d as UIElement;
            if ((bool)e.NewValue)
                element.PreviewMouseWheel += element_PreviewMouseWheel;
            else
                element.PreviewMouseWheel -= element_PreviewMouseWheel;
        }

        static void element_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
        {
            IInputElement element = FocusManager.GetFocusedElement(sender as DependencyObject);
            if (element != null && e.Source != element)
            {
                MouseWheelEventArgs args = new MouseWheelEventArgs(Mouse.PrimaryDevice, e.Timestamp, e.Delta) { RoutedEvent = UIElement.MouseWheelEvent };
                element.RaiseEvent(args);
                e.Handled = true;
            }
        }
    }
}

此属性也可以通过样式或以编程方式设置

例如

<Style x:key="MyScrollStyle">
    <Setter Property="l:MouseExtension.ScrollAnywhere" Value="true"/>
</Style>

MouseExtension.SetScrollAnywhere(element, true);

element.SetValue(MouseExtension.ScrollAnywhereProperty, true);

方法2:覆盖方法

如果您可以访问窗口或用户控件后面的代码,这是一种相当简单的方法。

只需将下面的代码粘贴到课程中,其余部分将被处理

    protected override void OnMouseWheel(MouseWheelEventArgs e)
    {
        IInputElement element = FocusManager.GetFocusedElement(this);
        if (element != null && e.Source != element)
        {
            MouseWheelEventArgs args = new MouseWheelEventArgs(Mouse.PrimaryDevice, e.Timestamp, e.Delta) { RoutedEvent = UIElement.MouseWheelEvent };
            element.RaiseEvent(args);
            e.Handled = true;
        }
        base.OnMouseWheel(e);
    }

<强>结论

您可以选择您喜欢的方法。我建议去附加属性方法,因为这使得这种行为即插即用。例如。您可以通过复选框打开或关闭行为。您可以将用户首选项存储在设置中并应用于该属性。

附加属性允许您扩展行为,在此之后可能还需要其他行为。