WPF - 以一种方式从滚动条效果中排除元素

时间:2012-12-06 07:45:11

标签: c# wpf grid scrollviewer

有没有办法从某个滚动效果中排除某些UIElement?我在列标题元素下面有一个网格元素。虽然我想在网格上完全滚动,但我希望标题只受水平滚动的影响。这样当向下滚动时它总会保持在顶部。

这是一个mspaint我解释,以防我的言论没有意义。

enter image description here

4 个答案:

答案 0 :(得分:1)

为什么不将滚动查看器移动到绿色行中,然后为标题设置不同的滚动查看器。

然后将其全部包装在父容器中

所以喜欢

<Grid>   
   <HeaderControl>
     <ScrollViewer />
   </HeaderControl>
   <BodyControl>
     <ScrollViewer />
   </BodyContent>
</Grid>

在一个滚动查看器中将它们包装在一起过于复杂。将其拆分为两个不同的滚动查看器将简化问题IMO。

答案 1 :(得分:0)

如果您使用了2个单独的滚动查看器 - 一个包含标题和网格的外部滚动查看器,并且只处理水平滚动,该怎么办。

然后网格本身可以包裹在一个单独的滚动查看器中,该查看器只处理网格的垂直滚动。 E.g:

<ScrollViewer VerticalScrollBarVisibility="Disabled">  
   <!-- Header -->
   <Grid>
   </Grid>
   <ScrollViewer HorizontalScrollBarVisibility="Hidden">
      <!-- Content -->
      <Grid>
      </Grid>
   <ScrollViewer />
</Grid>

虽然我对这两种可见性设置并不是100%肯定 - 你可能不得不玩它们来看看它是什么有用

答案 2 :(得分:0)

我只是想做同样的事情。我的解决方案是使用Canvas作为标题,使用Scrollviewer作为正文。

<Canvas>
    <Grid Canvas.Left="{Binding ElementName=ValueScrollViewer, Path=HorizontalOffset, Converter={StaticResource DoubleMultiplyingConverter}, ConverterParameter=-1}">
       Header
    </Grid>
</Canvas>
<ScrollViewer Name="ValueScrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" >
    <Grid>
        Table
    </Grid>
</ScrollViewer>

使用转换器:

public class DoubleMultiplyingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var factor = System.Convert.ToDouble(parameter, CultureInfo.InvariantCulture);
        var val = System.Convert.ToDouble(value);
        return val * factor;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

}

答案 3 :(得分:0)

要处理所有情况,您应该将静态部分(标题)和可滚动部分(正文)分开,并用ScrollViewer包裹正文。该解决方案在所有情况下都是完美的,除了您的控件比屏幕(或外部控件)宽的情况之外,因此也应允许水平滚动并且还应滚动标题。您不能仅使用内部滚动浏览器,因为垂直滚动条仅在水平滚动在右边缘时才可见。

不能仅从垂直滚动中排除页眉,但是可以模拟水平滚动。您只需翻译转换即可。

<Grid>
  <!-- body part. place it first to make it go to the background -->
  <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" x:Name="scrollbar">
    <!-- the body control itself -->
    <Canvas x:Name="PART_Body"/>
  </ScrollViewer>

  <!-- header part. Border and margin are used to make it not overlap vertical scrollbar -->
  <Border Margin="0,0,18,18" ClipToBounds="True">
    <Canvas x:Name="PART_Header">
      <Canvas.RenderTransform>
        <!-- bind X to the scrollbar X position -->
        <TranslateTransform X="{Binding ElementName=scrollbar, Path=ContentHorizontalOffset, Converter={StaticResource InvertDoubleConverter}}"/>
        <!-- InvertDoubleConverter is just a value converter which multiples incmoing double value by -1 -->
        </Canvas.RenderTransform>
      </Canvas>
  </Border>
</Grid>