C# 在应用程序的任何位置滚动都会导致在上次使用的组合框中滚动

C# 在应用程序的任何位置滚动都会导致在上次使用的组合框中滚动,c#,wpf,scroll,mousewheel,C#,Wpf,Scroll,Mousewheel,我想添加到我的应用程序中,当我在应用程序的任何位置使用鼠标滚轮时,它应该在上次激活或上次使用的组合框中显示滚动 你能帮我吗?我该如何进行 非常感谢。以下是我试图解决这个问题的两种方法 方法1:附加属性 我已经创建了一个类MouseExtension,它带有一个附加属性ScrollAnywhere,可以在应用程序的任何元素上启用bahavior。您也可以选择有不同的可滚动区域,所以当鼠标位于各自的区域时,可以滚动不同的组合框。您可能有一个子区域,该子区域仅对其子控件具有此行为。可能性是无限的 此外

我想添加到我的应用程序中,当我在应用程序的任何位置使用鼠标滚轮时,它应该在上次激活或上次使用的组合框中显示滚动

你能帮我吗?我该如何进行


非常感谢。

以下是我试图解决这个问题的两种方法

方法1:附加属性

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

此外,这种方法使其可注射

范例


...
我设置了属性
l:MouseExtension.ScrollAnywhere=“true”
以启用该行为

代码

名称空间CSharpWPF
{
类MouseExtension:DependencyObject
{
公共静态bool GetScrollAnywhere(DependencyObject obj)
{
返回(bool)对象GetValue(ScrollAnywhere属性);
}
公共静态无效设置CrollanWhere(DependencyObject对象,布尔值)
{
对象设置值(ScrollAnywhere属性,值);
}
//使用DependencyProperty作为ScrollAnywhere的备份存储。这将启用动画、样式、绑定等。。。
公共静态只读从属属性ScrollAnywhere属性=
DependencyProperty.RegisterAttached(“ScrollAnywhere”、typeof(bool)、typeof(MouseExtension)、new PropertyMetadata(false、OnScrollAnywhere));
CrollanyWhere上的私有静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
UIElement=d作为UIElement;
if((bool)e.NewValue)
element.PreviewMouseWheel+=元素_PreviewMouseWheel;
其他的
element.PreviewMouseWheel-=element_PreviewMouseWheel;
}
静态无效元素\u PreviewMouseWheel(对象发送器,System.Windows.Input.MouseWheelEventArgs e)
{
IIInputElement元素=FocusManager.GetFocusedElement(发送方作为DependencyObject);
if(element!=null&&e.Source!=element)
{
MouseWheelEventArgs args=新的MouseWheelEventArgs(Mouse.PrimaryDevice,e.Timestamp,e.Delta){RouteEvent=UIElement.MouseWheelEvent};
元素。RaiseEvent(args);
e、 已处理=正确;
}
}
}
}
此属性也可以通过样式或编程方式进行设置

乙二醇


MouseExtension.SetScrollAnywhere(元素,true);

element.SetValue(MouseExtension.scrollAnywhere属性,true);

方法2:覆盖方法

如果您可以访问窗口或用户控件背后的代码,那么这是一种非常简单的方法

只需将下面的代码粘贴到类中,其余代码将被处理

鼠标滚轮上受保护的覆盖无效(鼠标滚轮事件参数e) { IInputElement=FocusManager.GetFocusedElement(这个); if(element!=null&&e.Source!=element) { MouseWheelEventArgs args=新的MouseWheelEventArgs(Mouse.PrimaryDevice,e.Timestamp,e.Delta){RouteEvent=UIElement.MouseWheelEvent}; 元素。RaiseEvent(args); e、 已处理=正确; } 底轮(e); }
结论

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


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

您可以发布xaml或类似场景的任何代码吗?同时指出代码中的滚动问题。您好,pushpraj,非常感谢您的回答。很抱歉,我没有类似场景的代码。但也许我可以更详细地描述一下:当我有一个WPF组合框时。然后我可以单击它并选择一个值。当我将鼠标悬停在这个组合框上并使用鼠标滚轮时,选择就会改变(只要我使用鼠标滚轮)。这是WPF的集成标准功能。现在我想在我的应用程序的任何地方激活此功能:而不仅仅是在这个组合框的悬停位置。我希望这有点帮助。如果你理解正确,那么不管鼠标是否悬停,你都希望鼠标滚轮在聚焦元素上工作。如果我不同意你的想法,请纠正我。哇,普什普拉,非常感谢你详细的回答!你的两种方法太棒了。多谢各位。我还有一个问题:当我有两个组合框并且使用其中一个时(正常使用,我点击它并选择一个值),那么当我从这个组合框中使用鼠标滚轮=>一切正常吗。但是当我使用第二个组合框时(我点击它并选择一个值),然后从这个组合框中我使用鼠标滚轮:然后两个组合框的值都会改变。我可以限制它,以便只使用最后一个活动的组合框吗?这取决于您使用的方法。如果您使用附加属性,请将其设置在两个组合框的公共根上,例如
,甚至设置为
窗口
,如示例所示。只需设置一次,设置多个时间可能会有不同的行为。我猜你已经在两个不同的用户控件上设置了它,如果是这样的话,只需移动到主窗口就可以了。第二个覆盖方法只能滚动最后一个聚焦元素。如果