39

次のXAMLでマウスホイールのスクロールを機能させるのに問題があります。わかりやすくするために簡略化しています。

<ScrollViewer
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible"
CanContentScroll="False"
>
    <Grid
    MouseDown="Editor_MouseDown"
    MouseUp="Editor_MouseUp"
    MouseMove="Editor_MouseMove"
    Focusable="False"
    >
        <Grid.Resources>
            <DataTemplate
            DataType="{x:Type local:DataFieldModel}"
            >
                <Grid
                Margin="0,2,2,2"
                >
                    <TextBox
                    Cursor="IBeam"
                    MouseDown="TextBox_MouseDown"
                    MouseUp="TextBox_MouseUp"
                    MouseMove="TextBox_MouseMove"
                    />
                </Grid>
            </DataTemplate>
        </Grid.Resources>
        <ListBox
        x:Name="DataFieldListBox"
        ItemsSource="{Binding GetDataFields}"
        SelectionMode="Extended"
        Background="Transparent"
        Focusable="False"
        >
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemContainerStyle>
                <Style
                TargetType="ListBoxItem"
                >
                    <Setter
                    Property="Canvas.Left"
                    Value="{Binding dfX}"
                    />
                    <Setter
                    Property="Canvas.Top"
                    Value="{Binding dfY}"
                    />
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>
    </Grid>
</ScrollViewer>

視覚的には、結果は既知のサイズの領域であり、コレクションから読み取られたsは、任意の位置、サイズなどを持つesでDataField表すことができます。'スタイルの「領域」が大きすぎて一度に表示できない場合は、水平および垂直スクロールが可能ですが、スクロールバーを使用する必要がありますTextBoxListBox

人間工学と正気を高めるために、マウスホイールのスクロールが可能であり、通常ScrollViewerは自動的に処理されますがListBox、親ScrollViewerが決して見ないように、これらのイベントを処理しているように見えます。これまでのところ、ホイールスクロールを機能させることができたのは、または親IsHitTestVisible=Falseのいずれかを設定することだけでしたが、もちろん、その後、子要素のマウスイベントは機能しません。ListBoxGrid

ScrollViewer他の子要素を保持しながら、マウスホイールイベントを確実に表示するにはどうすればよいですか?

編集:親からホイールイベントを盗む可能性ListBoxのある組み込みがあり、コントロールテンプレートを指定すると無効にできることを学びました。問題が解決した場合は、この質問を更新します。ScrollViewerScrollViewer

4

4 に答える 4

13

ControlTemplateaをListbox含まない に aを指定するとScrollViewer、問題が解決します。詳細については、この回答と次の 2 つの MSDN ページを参照してください。

ControlTemplate

ListBox のスタイルとテンプレート

于 2013-01-16T17:05:20.537 に答える
5

これを実装する別の方法は、次のように独自の ScrollViewer を作成することです。

public class MyScrollViewer : ScrollViewer
{
    protected override void OnMouseWheel(MouseWheelEventArgs e)
    {
        var parentElement = Parent as UIElement;
        if (parentElement != null)
        {
            if ((e.Delta > 0 && VerticalOffset == 0) ||
                (e.Delta < 0 && VerticalOffset == ScrollableHeight))
            {
                e.Handled = true;

                var routedArgs = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
                routedArgs.RoutedEvent = UIElement.MouseWheelEvent;
                parentElement.RaiseEvent(routedArgs);
            }
        }

        base.OnMouseWheel(e);
    }
}
于 2015-06-08T11:23:09.123 に答える