有没有办法从某个滚动效果中排除某些UIElement
?我在列标题元素下面有一个网格元素。虽然我想在网格上完全滚动,但我希望标题只受水平滚动的影响。这样当向下滚动时它总会保持在顶部。
这是一个mspaint我解释,以防我的言论没有意义。
答案 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>