如何在按下Ctrl时禁用ScrollViewer中的滚动

时间:2010-06-07 18:52:19

标签: .net silverlight

我想在按下Ctrl键的同时实现缩放功能。 但是当鼠标悬停在ScrollView上时,不会触发MouseWheel事件。

有什么办法吗?

ps:SilverLight 4.0

<UserControl x:Class="SilverlightApplication11.MainPage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         mc:Ignorable="d"
         d:DesignHeight="300"
         d:DesignWidth="400">

<Grid x:Name="LayoutRoot"
      Background="White">
    <ScrollViewer Background="Gray"
                  MouseWheel="ScrollViewer_MouseWheel"
                  x:Name="scrollViewer">
        <Rectangle Width="200"
                   Height="2000"
                   MouseWheel="ScrollViewer_MouseWheel"
                   Fill="AliceBlue" />
    </ScrollViewer>
</Grid>

    private void ScrollViewer_MouseWheel(object sender, MouseWheelEventArgs e)
    {
        if (Keyboard.Modifiers.HasFlag(ModifierKeys.Control))
        {
            zoom+=0.1;
            e.Handled = true;
        }
    }

4 个答案:

答案 0 :(得分:3)

没有使用风格,有一种更简单的方法。将ScrollViewer内容放在Border中,如:

<ScrollViewer>
  <Border MouseWheel="ScrollViewer_MouseWheel" Background="#01b0b0b0"> <!-- almost transparent to intercept events -->
      <!-- ... your content goes here ... -->
  </Border>
</ScrollViewer>

答案 1 :(得分:2)

我也有这个问题。我通过在单击ScrollViewer时将键盘焦点设置在ScrollViewer上来修复它。

答案 2 :(得分:0)

您的代码适合我。 ScrollViewer从不引发事件,因为ScrollViewer.OnMouseWheel已将其标记为已处理,但内部Rectangle实际上首先获取事件。也许HasFlag()有错误?

答案 3 :(得分:0)

我找到了解决方法:

为ScrollViewer创建一个样式,并在ScrollContentPresenter之前添加一个Border,如下所示

<Border MouseWheel="ScrollViewer_MouseWheel"
                                        Background="Transparent"/>
<ScrollContentPresenter x:Name="ScrollContentPresenter"
                                           Cursor="{TemplateBinding Cursor}"
                                           ContentTemplate="{TemplateBinding ContentTemplate}"
                                           Margin="{TemplateBinding Padding}" />