Xaml UWP FlipView防止用户交互

Xaml UWP FlipView防止用户交互,xaml,uwp,winrt-xaml,uwp-xaml,flipview,Xaml,Uwp,Winrt Xaml,Uwp Xaml,Flipview,是的,我已经在谷歌上搜索过了,这个解决方案不起作用: 因为我想继续用动画更改项目,但仅以编程方式 我调查了FlipView模板,发现所有交互/动画等都是使用ScrollingHost按名称构建的: <ScrollViewer x:Name="ScrollingHost" AutomationProperties.AccessibilityView="Raw" BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIn

是的,我已经在谷歌上搜索过了,这个解决方案不起作用:

因为我想继续用动画更改项目,但仅以编程方式

我调查了FlipView模板,发现所有交互/动画等都是使用ScrollingHost按名称构建的:

<ScrollViewer x:Name="ScrollingHost" AutomationProperties.AccessibilityView="Raw" BringIntoViewOnFocusChange="{TemplateBinding ScrollViewer.BringIntoViewOnFocusChange}" HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" HorizontalSnapPointsType="MandatorySingle" HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" IsTabStop="False" IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}" IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}" IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}" Padding="{TemplateBinding Padding}" TabNavigation="{TemplateBinding TabNavigation}" VerticalSnapPointsType="MandatorySingle" VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" ZoomMode="Disabled">
    <ItemsPresenter/>
</ScrollViewer>

如您所见,我尝试禁用ScrollingHost中的所有滚动,但仍然可以在触摸屏上切换项目。我怎样才能禁用它们呢?

如果您不需要与FlipView进行任何交互,这是一个简单但。。。一个丑陋的解决方案是在FlipView的顶部放置一个(几乎)透明的矩形

<Grid> 
    <FlipView ... />
    <Rectangle Fill="White" Opacity="0.01" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</Grid>

将FlipView的
IsitTestVisible
属性设置为false。 然后将
KeyboardNavigation.DirectionalNavigation
设置为none

这基本上是说“你不能碰我,也不能跟我说话”


Thomas Schneiter的答案仍然允许通过标签/其他有轨电车的导航方法来访问它

一年多之后,仍然没有禁用FlipView的好解决方案。下面是我最后所做的,它似乎在不创建新的FlipView控件的情况下完成了这个任务

编辑ControlTemplate并删除所有导航按钮。为DataTemplate容器添加透明背景。将
指针heelchanged
事件处理程序添加到DataTemplate容器,并将其设置为
e.Handled=true。最后,向FlipView添加一个
SelectionChanged
事件处理程序,并使其将所选项目重置回原始状态

XAML

需要自定义FlipView来控制触摸并将设置滴入自定义FlipView项目

公共密封类GalleryFlipView:FlipView
{
公共静态只读从属属性IsFlipEnabledProperty=
DependencyProperty.Register(“IsFlipEnabled”、typeof(bool)、typeof(GalleryFlipView)、new PropertyMetadata(true、IsFlipEnabledChanged));
私有静态void是FlipEnabledChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
如果(d是GalleryFlipView控件)
{
如果(control.GetTemplateChild(“ScrollingHost”)是ScrollViewer ScrollViewer)
{
scrollViewer.HorizontalScrollMode=control.IsFlipEnabled?ScrollMode.Auto:ScrollMode.Disabled;
}
如果(control.ContainerFromItem(control.SelectedItem)为GalleryFlipViewItem flipViewItem)
{
flipViewItem.IsFlipEnabled=control.IsFlipEnabled;
}
}
}
公共布尔值已启用
{
获取{return(bool)GetValue(IsFlipEnabledProperty);}
set{SetValue(IsFlipEnabledProperty,value);}
}
受保护的覆盖依赖对象GetContainerForItemOverride()
{
返回新GalleryFlipViewItem
{
IsFlipEnabled=this.IsFlipEnabled
};
}
}
现在我们需要为每个控件添加样式。我刚刚复制了FlipViewItem和FlipView的默认样式。我对FlipView做了一个小的调整,移除了向上/向下按钮,并添加了绑定以控制左/右按钮的可见性。为此,将原始按钮包装在网格中,然后使用转换器将布尔转换为可见性枚举

<Grid HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="{Binding IsFlipEnabled,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource BooleanToVisibleConverter}}">
    <Button x:Name="PreviousButtonHorizontal" Height="36" IsTabStop="False" Template="{StaticResource HorizontalPreviousTemplate}" UseSystemFocusVisuals="False" Width="20" />
</Grid>
<Grid HorizontalAlignment="Right" VerticalAlignment="Center" Visibility="{Binding IsFlipEnabled,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource BooleanToVisibleConverter}}">
    <Button x:Name="NextButtonHorizontal" Height="36" IsTabStop="False" Template="{StaticResource HorizontalNextTemplate}" UseSystemFocusVisuals="False" Width="20" />
</Grid>

由于IsFlipEnabled是一个DependencyProperty,因此可以使用绑定、xaml或代码隐藏来控制它

<controls:GalleryFlipView IsFlipEnabled="False">


最后,这似乎是正确的解决方案。令人沮丧的是,我们必须做大量工作才能简单地打开和关闭此功能。

如果您只想通过编程方式进行更改,那么使用ContentPresenter并更改内容岂不是更容易?添加一个进出动画和几乎设置。。。Flip view就是为了这个目的而设计的,它允许用户浏览一个集合,你真的想摆脱所有这些。这个解决方案不允许我使用文本框等子元素。@Cheese我明白了,在这种情况下,您可能需要打开FlipView的模板,取出其中允许用户物理输入的部分和绑定(如按钮);然后,为了阻止他们用手指左右滑动,你必须为触摸事件创建一个新方法,并处理它;正在停止控件接收此类输入。。。。或者只是通过处理各种可交互事件来完成这一切。该解决方案不允许我使用文本框等子元素。
<Grid HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="{Binding IsFlipEnabled,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource BooleanToVisibleConverter}}">
    <Button x:Name="PreviousButtonHorizontal" Height="36" IsTabStop="False" Template="{StaticResource HorizontalPreviousTemplate}" UseSystemFocusVisuals="False" Width="20" />
</Grid>
<Grid HorizontalAlignment="Right" VerticalAlignment="Center" Visibility="{Binding IsFlipEnabled,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource BooleanToVisibleConverter}}">
    <Button x:Name="NextButtonHorizontal" Height="36" IsTabStop="False" Template="{StaticResource HorizontalNextTemplate}" UseSystemFocusVisuals="False" Width="20" />
</Grid>
<controls:GalleryFlipView IsFlipEnabled="False">