如何允许在ListView/GridView项目控件中进行操作,同时允许在ListView/GridView上进行滚动和
本文关键字:GridView ListView 滚动 操作 控件 项目 何允许 | 更新日期: 2023-09-27 17:50:34
具体来说,我有一个自定义用户控件,它接收操作事件来滚动自定义DirectX控件。这个控件和其他类似的控件都是GridView中的项。我希望GridView能够通过默认的TranslateRailsX操作水平滚动,而控件应该能够接收TranslateRailsY操作事件。
在我的实验到目前为止,通过设置控件的操作模式为系统,我可以得到GridView滚动工作,但控件将不会收到任何操作事件。通过将控件的操作模式设置为All,或TranslateY,或TranslateRailsY,我可以让我的自定义控件接收操作事件,但GridView触摸滚动将不起作用。
我怎么能允许这两个操作?
这不能在8.0中完成(对于8.1滚动到编辑)。你需要实现你自己的ScrollViewer在GridView模板中使用,或者像我之前建议的那样,在GridView的顶部放置一层并中继所有输入调用。实际上,也许实现你自己版本的ScrollViewer并不难(一个Canvas控件,有一个子控件调用Canvas)。
我有一个可能对你有用的新想法是把另一个ScrollViewer放在你的DirectX控件前面,并使用它的ViewChanged事件,就像你使用操纵事件一样-检查这个:
XAML
<Page
x:Class="App84.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App84"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid
Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<GridView>
<Grid
Width="300"
Height="300">
<Rectangle
x:Name="DirectXControlPlaceholder"
Width="300"
Height="300"
Fill="Yellow" />
<ScrollViewer
x:Name="ManipulationCaptureScrollViewer"
Style="{StaticResource VerticalScrollViewerStyle}"
VerticalScrollBarVisibility="Hidden"
ViewChanged="ScrollViewer_OnViewChanged">
<Rectangle
Width="200"
Height="10000"
Fill="Transparent"/>
</ScrollViewer>
<TextBlock
x:Name="OffsetTextBlock"
Foreground="Black"
FontSize="24"
VerticalAlignment="Center"
HorizontalAlignment="Center"
/>
</Grid>
<Rectangle
Width="300"
Height="300"
Fill="GreenYellow" />
<Rectangle
Width="300"
Height="300"
Fill="LimeGreen" />
<Rectangle
Width="300"
Height="300"
Fill="Red" />
<Rectangle
Width="300"
Height="300"
Fill="OrangeRed" />
<Rectangle
Width="300"
Height="300"
Fill="DarkOrange" />
<Rectangle
Width="300"
Height="300"
Fill="Orange" />
</GridView>
</Grid>
</Page>
代码后面
using Windows.UI.Xaml.Controls;
namespace App84
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private void ScrollViewer_OnViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
OffsetTextBlock.Text =
ManipulationCaptureScrollViewer.VerticalOffset.ToString();
}
}
}
编辑*
同样在Windows 8.1中,你得到了ManipulationModes.System
,它结合了其他模式(不支持缩放和旋转),应该允许你处理ScrollViewer
内部的操作。然后你可以在被操纵的元素上调用CancelDirectManipulations()
,一旦你想让它的父元素ScrollViewers
停止处理缩放操作。
在xaml中可以为ManipulationMode设置两个值。希望它能处理好。
ManipulationMode="TranslateX,System"