我在ListBox中使用ComboBox作为ItemTemplate。我的ComboBox是可编辑的。当用户在组合框中使用鼠标滚轮时,它会改变当前值。我不希望这样。我想要ListBox滚动。这有什么解决方案吗? 我发现的大多数示例都只基于一个只读的ComboBox。 似乎我找不到任何解决方案。 覆盖OnMouseWheel设置isHandled = true不起作用 看来这个事件是在其他地方处理的。我试图覆盖OnMouseWheel 我的ComboBox的ControlTemplate使用的TextBox没有成功。
任何想法?
答案 0 :(得分:6)
好吧,我的错误,我将PreviewMouseWheel放在我的ItemTemplate的错误UIElement上。 这是有效的:
private void myCombo_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
e.Handled = true;
}
尽管如此,“parentListBox.RaiseEvent(args);”不起作用。
答案 1 :(得分:2)
我用以下方法解决了类似的问题:
WPF:
<ComboBox MouseWheel="ComboBox_MouseWheel"/>
C#:
private void ComboBox_MouseWheel(object sender, MouseWheelEventArgs e)
{
e.Handled = true;
MouseWheelEventArgs args = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
args.RoutedEvent = UIElement.MouseWheelEvent;
args.Source = sender;
parentListBox.RaiseEvent(args);
}
答案 2 :(得分:2)
我用行为(和@XamlZealot提供的逻辑)解决了你的问题:
internal class ComboBoxIsNotScrollingItemsBehavior : Behavior<ComboBox>
{
protected override void OnAttached()
{
this.AssociatedObject.PreviewMouseWheel += this.ComboBox_PreviewMouseWheel;
}
protected override void OnDetaching()
{
this.AssociatedObject.PreviewMouseWheel -= this.ComboBox_PreviewMouseWheel;
}
private void ComboBox_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
if (this.AssociatedObject.IsDropDownOpen == false)
{
e.Handled = true;
((FrameworkElement)this.AssociatedObject.Parent).RaiseEvent(new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
{
RoutedEvent = UIElement.MouseWheelEvent,
Source = sender
});
}
}
}
答案 3 :(得分:1)
尝试在构造函数中注册类处理程序:
EventManager.RegisterClassHandler(typeof(ComboBox), ComboBox.MouseWheelEvent, new RoutedEventHandler(MouseWheeled));
private void MouseWheeled(object Sender, RoutedEventArgs e)
{
MouseWheelEventArgs mouseArgs = (MouseWheelEventArgs)e;
e.Handled = true;
MouseWheelEventArgs args = new MouseWheelEventArgs(mouseArgs.MouseDevice, mouseArgs.Timestamp, mouseArgs.Delta);
args.RoutedEvent = UIElement.MouseWheelEvent;
args.Source = Sender;
parentListBox.RaiseEvent(args);
}
答案 4 :(得分:0)
说我们的情况是否正确,工具栏中的字体列表框:选择一个新字体,其中先前选择的字体仍然显示为选定值,但您可以垂直滚动?
在这种情况下你能考虑这样的样本吗? creating a Font Box也是如此。
进一步参考: 你可以查看这个MSDN article吗?