如何在 UWP 的滚动查看器中启用水平滚动和禁用垂直滚动?
How do I enable horizontal scroll and disable vertical scroll within a scrollviewer in UWP?
这是我开始的XAML:
<ScrollViewer Height="500"
Width="500"
Name="parentScrollViewer">
<StackPanel>
<Grid Height="300"
Background="Red" />
<ScrollViewer Width="500"
HorizontalScrollBarVisibility="Auto"
Name="childScrollViewer">
<Grid Height="300"
Width="600"
Background="Green"/>
</ScrollViewer>
<Grid Height="300"
Background="Blue" />
</StackPanel>
</ScrollViewer>
基本上,如果我在 childScrollViewer 上禁用所有滚动,我会得到我想要的垂直效果(parentScrollViewer 可以滚动所有内容),但是如果我在 childScrollViewer 上启用水平滚动(以获得正确的水平效果),我松开我想要的垂直效果。
我真的不在乎是否必须让每个人都使用滚动条来水平滚动,但如果我不必那样做,那将是一个奖励。
我找到了 post,这似乎是我要找的东西,但我无法找出 UWP 等效项(也许将 PointerWheelChanged 事件重定向到 parentScrollViewer?)
或者,当且仅当触摸滚动条(或按下鼠标)时,我研究了启用水平滚动,但我找不到要监听的正确事件。
我找到了一个我觉得很不错的解决方案,但我不打算(至少暂时)标记它,希望有人有更好的解决方案。
我刚刚添加了一个高度刚好足以显示滚动条的滚动查看器,并在触摸时启用了 childScrollViewer。
这是我的 XAML:
<ScrollViewer Height="500"
Width="500"
Name="parentScrollViewer">
<StackPanel>
<Grid Height="300"
Background="Red" />
<ScrollViewer Width="500"
HorizontalScrollMode="Disabled"
HorizontalScrollBarVisibility="Hidden"
Name="childScrollViewer"
PointerPressed="ChildScrollViewer_PointerPressed"
PointerReleased="ChildScrollViewer_PointerReleased"
PointerExited="ChildScrollViewer_PointerReleased"
>
<Grid Height="300"
Width="600"
Background="Green">
<TextBlock Text="left"
HorizontalTextAlignment="Left" />
<TextBlock Text="right"
HorizontalTextAlignment="Right" />
</Grid>
</ScrollViewer>
<ScrollViewer Width="500"
HorizontalScrollBarVisibility="Auto"
Name="childScrollViewer2"
ViewChanged="ScrollViewer_ViewChanged">
<Grid Height="16"
Width="600"
Background="Green">
</Grid>
</ScrollViewer>
<Grid Height="300"
Background="Blue" />
</StackPanel>
</ScrollViewer>
这是我的 C#:
private void ChildScrollViewer_PointerPressed(object sender, PointerRoutedEventArgs e)
{
childScrollViewer.HorizontalScrollMode = ScrollMode.Enabled;
}
private void ChildScrollViewer_PointerReleased(object sender, PointerRoutedEventArgs e)
{
childScrollViewer.HorizontalScrollMode = ScrollMode.Disabled;
}
private void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
if (!(sender is ScrollViewer s))
{
return;
}
childScrollViewer.HorizontalScrollMode = ScrollMode.Enabled;
childScrollViewer.ChangeView(s.HorizontalOffset, null, null);
childScrollViewer.HorizontalScrollMode = ScrollMode.Disabled;
}
这是我开始的XAML:
<ScrollViewer Height="500"
Width="500"
Name="parentScrollViewer">
<StackPanel>
<Grid Height="300"
Background="Red" />
<ScrollViewer Width="500"
HorizontalScrollBarVisibility="Auto"
Name="childScrollViewer">
<Grid Height="300"
Width="600"
Background="Green"/>
</ScrollViewer>
<Grid Height="300"
Background="Blue" />
</StackPanel>
</ScrollViewer>
基本上,如果我在 childScrollViewer 上禁用所有滚动,我会得到我想要的垂直效果(parentScrollViewer 可以滚动所有内容),但是如果我在 childScrollViewer 上启用水平滚动(以获得正确的水平效果),我松开我想要的垂直效果。
我真的不在乎是否必须让每个人都使用滚动条来水平滚动,但如果我不必那样做,那将是一个奖励。
我找到了
或者,当且仅当触摸滚动条(或按下鼠标)时,我研究了启用水平滚动,但我找不到要监听的正确事件。
我找到了一个我觉得很不错的解决方案,但我不打算(至少暂时)标记它,希望有人有更好的解决方案。
我刚刚添加了一个高度刚好足以显示滚动条的滚动查看器,并在触摸时启用了 childScrollViewer。
这是我的 XAML:
<ScrollViewer Height="500"
Width="500"
Name="parentScrollViewer">
<StackPanel>
<Grid Height="300"
Background="Red" />
<ScrollViewer Width="500"
HorizontalScrollMode="Disabled"
HorizontalScrollBarVisibility="Hidden"
Name="childScrollViewer"
PointerPressed="ChildScrollViewer_PointerPressed"
PointerReleased="ChildScrollViewer_PointerReleased"
PointerExited="ChildScrollViewer_PointerReleased"
>
<Grid Height="300"
Width="600"
Background="Green">
<TextBlock Text="left"
HorizontalTextAlignment="Left" />
<TextBlock Text="right"
HorizontalTextAlignment="Right" />
</Grid>
</ScrollViewer>
<ScrollViewer Width="500"
HorizontalScrollBarVisibility="Auto"
Name="childScrollViewer2"
ViewChanged="ScrollViewer_ViewChanged">
<Grid Height="16"
Width="600"
Background="Green">
</Grid>
</ScrollViewer>
<Grid Height="300"
Background="Blue" />
</StackPanel>
</ScrollViewer>
这是我的 C#:
private void ChildScrollViewer_PointerPressed(object sender, PointerRoutedEventArgs e)
{
childScrollViewer.HorizontalScrollMode = ScrollMode.Enabled;
}
private void ChildScrollViewer_PointerReleased(object sender, PointerRoutedEventArgs e)
{
childScrollViewer.HorizontalScrollMode = ScrollMode.Disabled;
}
private void ScrollViewer_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
if (!(sender is ScrollViewer s))
{
return;
}
childScrollViewer.HorizontalScrollMode = ScrollMode.Enabled;
childScrollViewer.ChangeView(s.HorizontalOffset, null, null);
childScrollViewer.HorizontalScrollMode = ScrollMode.Disabled;
}