【问题标题】:wpf scrollviewer mousewheel not working with stackpanelwpf scrollviewer鼠标滚轮不适用于stackpanel
【发布时间】:2014-08-18 15:22:59
【问题描述】:

我有一个带有滚动查看器的堆栈面板。在 stackpanel 内我有一些网格,在网格内又有 stackpanels 和一些由 MahApps Metro 控制的图块。

如果我拖动滚动条,滚动查看器工作正常。但鼠标滚轮不起作用。可能是某些控制正在窃取鼠标滚轮动作,但我无法确定是哪一个。我试图在专注于滚动条的同时滚动鼠标滚轮。但它仍然无法正常工作。

<ScrollViewer x:Name="TS" Grid.Row="1" HorizontalAlignment="Stretch" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" CanContentScroll="True" PanningMode="HorizontalOnly" SnapsToDevicePixels="True" Background="Transparent">
    <StackPanel x:Name="TilesPanel" VerticalAlignment="Top" HorizontalAlignment="Stretch" Orientation="Horizontal">
        <StackPanel.Resources>
            <Style TargetType="{x:Type Grid}">
                <Setter Property="Margin" Value="0,50,0,0"/>
            </Style>
        </StackPanel.Resources>
        <Separator Background="{x:Null}" Width="110"></Separator>
        <Grid>
            <StackPanel>
                <StackPanel Orientation="Horizontal">
                    <StackPanel.Resources>
                        <Style TargetType="{x:Type Grid}">
                            <Setter Property="Margin" Value="10,0,0,0"/>
                        </Style>
                    </StackPanel.Resources>
                    <Grid Height="260">
                        <StackPanel>
                            <StackPanel.Resources>
                                <Style TargetType="{x:Type StackPanel}">
                                    <Setter Property="Margin" Value="0,0,0,10"/>
                                </Style>
                            </StackPanel.Resources>
                        <StackPanel Width="247" Height="119">
                            <Custom:Tile x:Name="Mail" Margin="0" Width="auto" d:LayoutOverrides="Height">
                                <Image Stretch="Fill" Source="Res/AppTiles/Mail.png"/>
                            </Custom:Tile>
                        </StackPanel>

                        //and it goes on like this//

                        </grid>
                      </stackpanel>
                <Separator Background="{x:Null}" Width="50"/>
            </Grid>
    </StackPanel>
    </ScrollViewer>

网格会阻碍吗?或者有没有其他方法可以在 Horizo​​ntal Scrollviewer 中使用鼠标滚轮?我就是想不通。 请帮忙。

【问题讨论】:

  • 似乎Custom:Tile 正在消耗鼠标滚轮事件。您能否发布一些可重现的样本,我们可能会尝试为您找到根本原因。
  • 我已经询问了 MahApps 网站中创建该控件的开发人员。他们否认这个问题。而且我在另一个测试项目中尝试过,发现这些与鼠标滚轮动作无关。
  • 你能发布一些屏幕吗?如果您可以发布工作示例,我们将不胜感激。

标签: c# scrollviewer mousewheel stackpanel wpf-4.0


【解决方案1】:

是的,我想通了。并像这样以最小的方式解决它。

<ScrollViewer x:Name="TS" Grid.Row="1" HorizontalAlignment="Stretch" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled" CanContentScroll="True" PanningMode="HorizontalOnly" SnapsToDevicePixels="True" Background="Transparent" PreviewMouseWheel="TS_PreviewMouseWheel">

添加了 PreviewMouseWheel="TS_PreviewMouseWheel"

在后面的代码中,

private void TS_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        TS.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
        ScrollViewer scrollviewer = sender as ScrollViewer;
        if (e.Delta > 0)
        {
            scrollviewer.LineLeft();
        }
        else
        {
            scrollviewer.LineRight();
        }
        e.Handled = true;
 }

还是谢谢。

【讨论】:

    【解决方案2】:

    通常鼠标只有一个滚轮,用于垂直滚动。我假设你的情况也是如此。

    根据您的代码,您似乎想通过鼠标滚轮执行水平滚动。

    我提出了一个使用Attached properties的解决方案

    样本 xaml

    <ScrollViewer x:Name="TS"
                  Grid.Row="1"
                  HorizontalAlignment="Stretch"
                  HorizontalScrollBarVisibility="Auto"
                  VerticalScrollBarVisibility="Disabled"
                  CanContentScroll="False"
                  PanningMode="HorizontalOnly"
                  SnapsToDevicePixels="True"
                  Background="Transparent"
                  l:ScrollViewerExtensions.IsHorizontalScrollOnWheelEnabled="true">
    

    我已将ScrollViewerExtensions.IsHorizontalScrollOnWheelEnabled 附加到滚动查看器,它将通过鼠标滚轮实现水平滚动。还记得设置CanContentScroll="False",你的情况需要。

    ScrollViewerExtensions 类

    namespace CSharpWPF
    {
        class ScrollViewerExtensions : DependencyObject
        {
            public static bool GetIsHorizontalScrollOnWheelEnabled(DependencyObject obj)
            {
                return (bool)obj.GetValue(IsHorizontalScrollOnWheelEnabledProperty);
            }
    
            public static void SetIsHorizontalScrollOnWheelEnabled(DependencyObject obj, bool value)
            {
                obj.SetValue(IsHorizontalScrollOnWheelEnabledProperty, value);
            }
    
            // Using a DependencyProperty as the backing store for IsHorizontalScrollOnWheelEnabled.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty IsHorizontalScrollOnWheelEnabledProperty =
                DependencyProperty.RegisterAttached("IsHorizontalScrollOnWheelEnabled", typeof(bool), typeof(ScrollViewerExtensions), new PropertyMetadata(false, OnIsHorizontalScrollOnWheelEnabledChanged));
    
            private static void OnIsHorizontalScrollOnWheelEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                ScrollViewer sv = d as ScrollViewer;
                if ((bool)e.NewValue)
                    sv.PreviewMouseWheel += sv_PreviewMouseWheel;
                else
                    sv.PreviewMouseWheel -= sv_PreviewMouseWheel;
            }
    
            static void sv_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
            {
                ScrollViewer scrollviewer = sender as ScrollViewer;
                if (e.Delta > 0)
                    scrollviewer.LineLeft();
                else
                    scrollviewer.LineRight();
                e.Handled = true;
            }
        }
    }
    

    整个想法是听鼠标滚轮并根据滚轮增量(旋转)向左或向右滚动

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2021-03-18
      • 2012-12-07
      相关资源
      最近更新 更多