8

ListBox 内の ItemTemplate として ComboBox を使用します。私の ComboBox は編集可能です。ユーザーがコンボボックスでマウス ホイールを使用すると、現在の値が変更されます。私はそれをしたくありません。ListBox をスクロールさせたい。これに対する解決策はありますか?私が見つけたほとんどの例は、読み取り専用の ComboBox のみに基づいています。私が見つけた解決策はどれもうまくいかないようです。OnMouseWheel 設定のオーバーライド isHandled = true は機能しません。イベントは他の場所で処理されているようです。ComboBox の ControlTemplate で使用される TextBox で OnMouseWheel をオーバーライドしようとしましたが、成功しませんでした。

何か案は ?

4

5 に答える 5

8

さて、私の間違いです。PreviewMouseWheel を ItemTemplate の間違った UIElement に配置しました。だからこれは働いています:

private void myCombo_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    e.Handled = true;
}

それにもかかわらず、「parentListBox.RaiseEvent(args);」動作しません。

于 2012-11-08T10:45:48.480 に答える
3

Behavior (および @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
            });
        }
    }
}
于 2016-05-06T18:36:32.547 に答える
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);
}
于 2012-11-07T15:19:39.503 に答える
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);
}
于 2012-11-07T16:03:17.867 に答える
0

私たちのケースは、ツールバーのフォント リスト ボックス: 新しいフォントの選択で、以前に選択したフォントが選択された値として表示されているが、垂直方向にスクロールできるようなものであると言うのは正しいでしょうか?

その場合、このようなサンプルを検討していただけますか?フォント ボックスも作成します。

詳細な参照: このMSDN の記事を確認していただけますか?

于 2012-11-07T15:41:07.543 に答える