2010-09-16 48 views
2

我无法在Silverlight 4的列表框控件中禁用鼠标滚轮滚动的默认行为,并将自定义滚动动画应用于mousewheel事件上的列表框。当我将动画添加到列表框的鼠标滚轮事件中时,第一个列表框项目会根据鼠标滚轮移动滚动,然后我的自定义动画滚动列表框项目会被触发。请回答我的查询。如何在Silverlight 4的列表框中禁用鼠标滚轮滚动?

+0

我不能删除的ScrollViewer列表框控件中因为我的动画的ScrollViewer垂直的动画滚动的偏移。所以请任何其他建议。 – 2010-09-18 16:59:28

+0

问题*是* ScrollViewer。您可以*设置其他容器类型的偏移量。您不需要为ScrollViewer设置动画,所以摆脱它并使用另一个容器(或多个容器)。 – 2010-09-19 20:02:14

回答

1

我找不到任何简单的方法来关闭它,但您可以更改列表框的模板以使用不同的容器(它在内部使用ScrollViewer)。

这样最简单的版本是from another answer

<ListBox.Template> 
    <ControlTemplate> 
     <ItemsPresenter /> 
    </ControlTemplate> 
</ListBox.Template> 

你真的需要为一个列表框模板看起来像这样的Expression Blend进行修改,一个完整的模板:

<UserControl.Resources> 
     <ControlTemplate x:Key="ValidationToolTipTemplate"> 
      <Grid x:Name="Root" Margin="5,0" Opacity="0" RenderTransformOrigin="0,0"> 
       <Grid.RenderTransform> 
        <TranslateTransform x:Name="xform" X="-25"/> 
       </Grid.RenderTransform> 
       <VisualStateManager.VisualStateGroups> 
        <VisualStateGroup x:Name="OpenStates"> 
         <VisualStateGroup.Transitions> 
          <VisualTransition GeneratedDuration="0"/> 
          <VisualTransition GeneratedDuration="0:0:0.2" To="Open"> 
           <Storyboard> 
            <DoubleAnimation Duration="0:0:0.2" To="0" Storyboard.TargetProperty="X" Storyboard.TargetName="xform"> 
             <DoubleAnimation.EasingFunction> 
              <BackEase Amplitude=".3" EasingMode="EaseOut"/> 
             </DoubleAnimation.EasingFunction> 
            </DoubleAnimation> 
            <DoubleAnimation Duration="0:0:0.2" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/> 
           </Storyboard> 
          </VisualTransition> 
         </VisualStateGroup.Transitions> 
         <VisualState x:Name="Closed"> 
          <Storyboard> 
           <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/> 
          </Storyboard> 
         </VisualState> 
         <VisualState x:Name="Open"> 
          <Storyboard> 
           <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="X" Storyboard.TargetName="xform"/> 
           <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/> 
          </Storyboard> 
         </VisualState> 
        </VisualStateGroup> 
       </VisualStateManager.VisualStateGroups> 
       <Border Background="#052A2E31" CornerRadius="5" Margin="4,4,-4,-4"/> 
       <Border Background="#152A2E31" CornerRadius="4" Margin="3,3,-3,-3"/> 
       <Border Background="#252A2E31" CornerRadius="3" Margin="2,2,-2,-2"/> 
       <Border Background="#352A2E31" CornerRadius="2" Margin="1,1,-1,-1"/> 
       <Border Background="#FFDC000C" CornerRadius="2"/> 
       <Border CornerRadius="2"> 
        <TextBlock Foreground="White" MaxWidth="250" Margin="8,4,8,4" TextWrapping="Wrap" Text="{Binding (Validation.Errors)[0].ErrorContent}" UseLayoutRounding="false"/> 
       </Border> 
      </Grid> 
     </ControlTemplate> 
     <Style x:Key="ListBoxStyle1" TargetType="ListBox"> 
      <Setter Property="Padding" Value="1"/> 
      <Setter Property="Background" Value="#FFFFFFFF"/> 
      <Setter Property="Foreground" Value="#FF000000"/> 
      <Setter Property="HorizontalContentAlignment" Value="Left"/> 
      <Setter Property="VerticalContentAlignment" Value="Top"/> 
      <Setter Property="IsTabStop" Value="False"/> 
      <Setter Property="BorderThickness" Value="1"/> 
      <Setter Property="TabNavigation" Value="Once"/> 
      <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> 
      <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
      <Setter Property="BorderBrush"> 
       <Setter.Value> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="#FFA3AEB9" Offset="0"/> 
         <GradientStop Color="#FF8399A9" Offset="0.375"/> 
         <GradientStop Color="#FF718597" Offset="0.375"/> 
         <GradientStop Color="#FF617584" Offset="1"/> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBox"> 
         <Grid> 
          <VisualStateManager.VisualStateGroups> 
           <VisualStateGroup x:Name="ValidationStates"> 
            <VisualState x:Name="Valid"/> 
            <VisualState x:Name="InvalidUnfocused"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 <Visibility>Visible</Visibility> 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
            <VisualState x:Name="InvalidFocused"> 
             <Storyboard> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 <Visibility>Visible</Visibility> 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
              <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="validationTooltip"> 
               <DiscreteObjectKeyFrame KeyTime="0"> 
                <DiscreteObjectKeyFrame.Value> 
                 <System:Boolean>True</System:Boolean> 
                </DiscreteObjectKeyFrame.Value> 
               </DiscreteObjectKeyFrame> 
              </ObjectAnimationUsingKeyFrames> 
             </Storyboard> 
            </VisualState> 
           </VisualStateGroup> 
          </VisualStateManager.VisualStateGroups> 
          <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"> 
           <ScrollViewer x:Name="ScrollViewer" BorderBrush="Transparent" BorderThickness="0" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" TabNavigation="{TemplateBinding TabNavigation}"> 
            <ItemsPresenter/> 
           </ScrollViewer> 
          </Border> 
          <Border x:Name="ValidationErrorElement" BorderBrush="#FFDB000C" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2" Visibility="Collapsed"> 
           <ToolTipService.ToolTip> 
            <ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Template="{StaticResource ValidationToolTipTemplate}"> 
             <ToolTip.Triggers> 
              <EventTrigger RoutedEvent="Canvas.Loaded"> 
               <BeginStoryboard> 
                <Storyboard> 
                 <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip"> 
                  <DiscreteObjectKeyFrame KeyTime="0"> 
                   <DiscreteObjectKeyFrame.Value> 
                    <System:Boolean>true</System:Boolean> 
                   </DiscreteObjectKeyFrame.Value> 
                  </DiscreteObjectKeyFrame> 
                 </ObjectAnimationUsingKeyFrames> 
                </Storyboard> 
               </BeginStoryboard> 
              </EventTrigger> 
             </ToolTip.Triggers> 
            </ToolTip> 
           </ToolTipService.ToolTip> 
           <Grid Background="Transparent" HorizontalAlignment="Right" Height="10" Margin="0,-4,-4,0" VerticalAlignment="Top" Width="10"> 
            <Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="#FFDC000C" Margin="-1,3,0,0"/> 
            <Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#ffffff" Margin="-1,3,0,0"/> 
           </Grid> 
          </Border> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </UserControl.Resources> 
0

试试这个:上layoutUpdate事件从scrollview获得ScrollContentPresenter

private ScrollContentPresenter Scp;  
void ScrollView_LayoutUpdated(object sender, EventArgs e) 
    { 
     if (Scp == null) 
     { 
      try 
      { 

       FrameworkElement myFE = (FrameworkElement)VisualTreeHelper.GetChild(ScrollView, 0); 
       Scp = (ScrollContentPresenter)myFE.FindName("ScrollContentPresenter"); 
       Scp.MouseWheel += new MouseWheelEventHandler(Scp_MouseWheel); 

      } 
      catch (Exception) 
      { 


      } 
     } 

然后在SCP鼠标滚轮事件:

void Scp_MouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     e.Handled = true; 
    } 
相关问题