我想添加到我的应用程序中,当我在应用程序的任何地方使用鼠标滚轮时,应该在最后一个活动组件或最后使用的组合框中滚动。
你能帮帮我吗?我该怎么办呢。非常感谢。
答案 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);
}
<强>结论强>
您可以选择您喜欢的方法。我建议去附加属性方法,因为这使得这种行为即插即用。例如。您可以通过复选框打开或关闭行为。您可以将用户首选项存储在设置中并应用于该属性。
附加属性允许您扩展行为,在此之后可能还需要其他行为。