WinRT GridView禁用项目选择,但保持启用状态

时间:2012-08-21 09:07:42

标签: windows gridview microsoft-metro windows-runtime

这类似于disabling selection of a single item,但是,我想保持项目启用(对于tap,aka click事件)。因此,将IsEnabled简单设置为false显然不是一个选项。什么是实现这一目标的好方法?

2 个答案:

答案 0 :(得分:0)

给项目绑定一个bool类型的额外属性(例如canBeSelected),处理selectionchanged事件并检查bool是否为false,如果将selecteditem设置为null

答案 1 :(得分:0)

您可以使用自定义样式解决此问题。

用法:

<GridViewItem Style="{StaticResource NonGridViewItemStyle}"> 
   <!-- Your content here-->
</GridViewItem>

将此样式放在资源字典中:

<Style x:Key="NonGridViewItemStyle"
   TargetType="GridViewItem">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="GridViewItem">
            <Border x:Name="OuterContainer">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="CommonStates">
                        <VisualState x:Name="Normal"/>
                        <VisualState x:Name="PointerOver">

                        </VisualState>
                        <VisualState x:Name="Pressed">
                            <Storyboard>
                                <PointerDownThemeAnimation TargetName="ContentContainer" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="PointerOverPressed">
                            <Storyboard>
                                <PointerDownThemeAnimation TargetName="ContentContainer" />
                                <DoubleAnimation Storyboard.TargetName="PointerOverBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SelectionBackground"
                                                                Storyboard.TargetProperty="Fill">
                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedPointerOverBackgroundThemeBrush}" />
                                </ObjectAnimationUsingKeyFrames>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SelectedBorder"
                                                                Storyboard.TargetProperty="Stroke">
                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedPointerOverBorderThemeBrush}" />
                                </ObjectAnimationUsingKeyFrames>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SelectedEarmark"
                                                               Storyboard.TargetProperty="Fill">
                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedPointerOverBackgroundThemeBrush}" />
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Disabled">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="contentPresenter"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="{ThemeResource ListViewItemDisabledThemeOpacity}" />
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                    <VisualStateGroup x:Name="FocusStates">
                        <VisualState x:Name="Focused">
                            <Storyboard>
                                <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisual" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Unfocused"/>
                        <VisualState x:Name="PointerFocused"/>
                    </VisualStateGroup>
                    <VisualStateGroup x:Name="SelectionHintStates">
                        <VisualState x:Name="VerticalSelectionHint">
                            <Storyboard>
                                <SwipeHintThemeAnimation TargetName="SelectionBackground" ToVerticalOffset="15" ToHorizontalOffset="0" />
                                <SwipeHintThemeAnimation TargetName="ContentBorder" ToVerticalOffset="15" ToHorizontalOffset="0" />
                                <SwipeHintThemeAnimation TargetName="SelectedBorder" ToVerticalOffset="15" ToHorizontalOffset="0" />
                                <SwipeHintThemeAnimation TargetName="SelectedCheckMark" ToVerticalOffset="15" ToHorizontalOffset="0" />
                                <DoubleAnimationUsingKeyFrames Storyboard.TargetName="HintGlyph"
                                                               Storyboard.TargetProperty="Opacity"
                                                               Duration="0:0:0.500">
                                    <DiscreteDoubleKeyFrame Value="0.5" KeyTime="0:0:0" />
                                    <DiscreteDoubleKeyFrame Value="0" KeyTime="0:0:0.500" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="HorizontalSelectionHint">
                            <Storyboard>
                                <SwipeHintThemeAnimation TargetName="SelectionBackground" ToHorizontalOffset="-23" ToVerticalOffset="0" />
                                <SwipeHintThemeAnimation TargetName="ContentBorder" ToHorizontalOffset="-23" ToVerticalOffset="0" />
                                <SwipeHintThemeAnimation TargetName="SelectedBorder" ToHorizontalOffset="-23" ToVerticalOffset="0" />
                                <SwipeHintThemeAnimation TargetName="SelectedCheckMark" ToHorizontalOffset="-23" ToVerticalOffset="0" />
                                <DoubleAnimationUsingKeyFrames Storyboard.TargetName="HintGlyph"
                                                               Storyboard.TargetProperty="Opacity"
                                                               Duration="0:0:0.500">
                                    <DiscreteDoubleKeyFrame Value="0.5" KeyTime="0:0:0" />
                                    <DiscreteDoubleKeyFrame Value="0" KeyTime="0:0:0.500" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="NoSelectionHint" />
                        <VisualStateGroup.Transitions>
                            <VisualTransition To="NoSelectionHint" GeneratedDuration="0:0:0.65"/>
                        </VisualStateGroup.Transitions>
                    </VisualStateGroup>
                    <VisualStateGroup x:Name="SelectionStates">
                        <VisualState x:Name="Unselecting">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="HintGlyphBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Unselected">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="HintGlyphBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="UnselectedPointerOver">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="HintGlyphBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter"
                                                               Storyboard.TargetProperty="Foreground">
                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedForegroundThemeBrush}" />
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="UnselectedSwiping">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="SelectingGlyph"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="0.5" />
                                <DoubleAnimation Storyboard.TargetName="HintGlyphBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Selecting">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="SelectionBackground"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="SelectedBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="SelectingGlyph"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="HintGlyphBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter"
                                                               Storyboard.TargetProperty="Foreground">
                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedForegroundThemeBrush}" />
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="Selected">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="SelectionBackground"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="SelectedBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="SelectedCheckMark"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter"
                                                               Storyboard.TargetProperty="Foreground">
                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedForegroundThemeBrush}" />
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="SelectedSwiping">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="SelectionBackground"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="SelectedBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="SelectedCheckMark"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter"
                                                               Storyboard.TargetProperty="Foreground">
                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedForegroundThemeBrush}" />
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="SelectedUnfocused">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="SelectionBackground"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="SelectedBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="SelectedCheckMark"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter"
                                                               Storyboard.TargetProperty="Foreground">
                                    <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedForegroundThemeBrush}" />
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                    <VisualStateGroup x:Name="DragStates">
                        <VisualState x:Name="NotDragging" />
                        <VisualState x:Name="Dragging">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="InnerDragContent"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="{ThemeResource ListViewItemDragThemeOpacity}" />
                                <DragItemThemeAnimation TargetName="InnerDragContent" />
                                <FadeOutThemeAnimation TargetName="SelectedCheckMarkOuter" />
                                <FadeOutThemeAnimation TargetName="SelectedBorder" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="DraggingTarget">
                            <Storyboard>
                                <DropTargetItemThemeAnimation TargetName="OuterContainer" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="MultipleDraggingPrimary">
                            <Storyboard>
                                <!-- These two Opacity animations are required - the FadeInThemeAnimations
                                     on the same elements animate an internal Opacity. -->
                                <DoubleAnimation Storyboard.TargetName="MultiArrangeOverlayBackground"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="MultiArrangeOverlayText"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="1" />
                                <DoubleAnimation Storyboard.TargetName="ContentBorder"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Duration="0"
                                                 To="{ThemeResource ListViewItemDragThemeOpacity}" />
                                <FadeInThemeAnimation TargetName="MultiArrangeOverlayBackground" />
                                <FadeInThemeAnimation TargetName="MultiArrangeOverlayText" />
                                <DragItemThemeAnimation TargetName="ContentBorder" />
                                <FadeOutThemeAnimation TargetName="SelectionBackground" />
                                <FadeOutThemeAnimation TargetName="SelectedCheckMarkOuter" />
                                <FadeOutThemeAnimation TargetName="SelectedBorder" />
                                <FadeOutThemeAnimation TargetName="PointerOverBorder" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="MultipleDraggingSecondary">
                            <Storyboard>
                                <FadeOutThemeAnimation TargetName="ContentContainer" />
                            </Storyboard>
                        </VisualState>
                        <VisualStateGroup.Transitions>
                            <VisualTransition To="NotDragging" GeneratedDuration="0:0:0.2"/>
                        </VisualStateGroup.Transitions>
                    </VisualStateGroup>
                    <VisualStateGroup x:Name="ReorderHintStates">
                        <VisualState x:Name="NoReorderHint"/>
                        <VisualState x:Name="BottomReorderHint">
                            <Storyboard>
                                <DragOverThemeAnimation TargetName="ReorderHintContent" ToOffset="{ThemeResource ListViewItemReorderHintThemeOffset}" Direction="Bottom" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="TopReorderHint">
                            <Storyboard>
                                <DragOverThemeAnimation TargetName="ReorderHintContent" ToOffset="{ThemeResource ListViewItemReorderHintThemeOffset}" Direction="Top" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="RightReorderHint">
                            <Storyboard>
                                <DragOverThemeAnimation TargetName="ReorderHintContent" ToOffset="{ThemeResource ListViewItemReorderHintThemeOffset}" Direction="Right" />
                            </Storyboard>
                        </VisualState>
                        <VisualState x:Name="LeftReorderHint">
                            <Storyboard>
                                <DragOverThemeAnimation TargetName="ReorderHintContent" ToOffset="{ThemeResource ListViewItemReorderHintThemeOffset}" Direction="Left" />
                            </Storyboard>
                        </VisualState>
                        <VisualStateGroup.Transitions>
                            <VisualTransition To="NoReorderHint" GeneratedDuration="0:0:0.2"/>
                        </VisualStateGroup.Transitions>
                    </VisualStateGroup>
                    <VisualStateGroup x:Name="DataVirtualizationStates">
                        <VisualState x:Name="DataAvailable"/>
                        <VisualState x:Name="DataPlaceholder">
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PlaceholderTextBlock"
                                                               Storyboard.TargetProperty="Visibility"
                                                               Duration="0">
                                    <DiscreteObjectKeyFrame KeyTime="0">
                                        <DiscreteObjectKeyFrame.Value>
                                            <Visibility>Visible</Visibility>
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                </ObjectAnimationUsingKeyFrames>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PlaceholderRect"
                                                               Storyboard.TargetProperty="Visibility"
                                                               Duration="0">
                                    <DiscreteObjectKeyFrame KeyTime="0">
                                        <DiscreteObjectKeyFrame.Value>
                                            <Visibility>Visible</Visibility>
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <Grid x:Name="ReorderHintContent" Background="Transparent">
                    <Path x:Name="SelectingGlyph" Opacity="0" Data="F1 M133.1,17.9 L137.2,13.2 L144.6,19.6 L156.4,5.8 L161.2,9.9 L145.6,28.4 z" Fill="{ThemeResource ListViewItemCheckSelectingThemeBrush}" Height="13" Stretch="Fill" Width="15" HorizontalAlignment="Right" Margin="0,9.5,9.5,0" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
                    <Border x:Name="HintGlyphBorder"
                            Height="40"
                            Width="40"
                            HorizontalAlignment="Right"
                            VerticalAlignment="Top"
                            Opacity="0"
                            Margin="4">
                        <Path x:Name="HintGlyph" Opacity="0" Data="F1 M133.1,17.9 L137.2,13.2 L144.6,19.6 L156.4,5.8 L161.2,9.9 L145.6,28.4 z" Fill="{ThemeResource ListViewItemCheckHintThemeBrush}" Height="13" Stretch="Fill"  Width="15" HorizontalAlignment="Right" Margin="0,5.5,5.5,0" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
                    </Border>
                    <Border x:Name="ContentContainer">
                        <!-- This extra wrapper grid is necessary because rendertransforms set by the reorder hint animations
                             will be lost when ContentContainer becomes a LTE -->
                        <Grid x:Name="InnerDragContent">
                            <Rectangle x:Name="PointerOverBorder"
                                       IsHitTestVisible="False"
                                       Opacity="0"
                                       Fill="{ThemeResource ListViewItemPointerOverBackgroundThemeBrush}"
                                       Margin="1" />
                            <Rectangle x:Name="FocusVisual"
                                       IsHitTestVisible="False"
                                       Opacity="0"
                                       StrokeThickness="2"
                                       Stroke="{ThemeResource ListViewItemFocusBorderThemeBrush}" />
                            <Rectangle x:Name="SelectionBackground"
                                       Margin="4"
                                       Fill="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}"
                                       Opacity="0" />
                            <Border x:Name="ContentBorder"
                                    Background="{TemplateBinding Background}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}"
                                    Margin="4">
                                <Grid>
                                    <ContentPresenter x:Name="contentPresenter"
                                                      ContentTransitions="{TemplateBinding ContentTransitions}"
                                                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                      Margin="{TemplateBinding Padding}" />
                                    <!-- The 'Xg' text simulates the amount of space one line of text will occupy.
                                         In the DataPlaceholder state, the Content is not loaded yet so we
                                         approximate the size of the item using placeholder text. -->
                                    <TextBlock x:Name="PlaceholderTextBlock"
                                               Visibility="Collapsed"
                                               Text="Xg"
                                               Foreground="{x:Null}"
                                               Margin="{TemplateBinding Padding}"
                                               IsHitTestVisible="False"
                                               AutomationProperties.AccessibilityView="Raw"/>
                                    <Rectangle x:Name="PlaceholderRect"
                                               Visibility="Collapsed"
                                               Fill="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}"/>
                                    <Rectangle x:Name="MultiArrangeOverlayBackground"
                                               IsHitTestVisible="False"
                                               Opacity="0"
                                               Fill="{ThemeResource ListViewItemDragBackgroundThemeBrush}" />
                                </Grid>
                            </Border>
                            <Rectangle x:Name="SelectedBorder"
                                       IsHitTestVisible="False"
                                       Opacity="0"
                                       Stroke="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}"
                                       StrokeThickness="{ThemeResource GridViewItemSelectedBorderThemeThickness}"
                                       Margin="4"/>
                            <Border x:Name="SelectedCheckMarkOuter"
                                    IsHitTestVisible="False"
                                    HorizontalAlignment="Right"
                                    VerticalAlignment="Top"
                                    Margin="4">
                                <Grid x:Name="SelectedCheckMark" Opacity="0" Height="40" Width="40">
                                    <Path x:Name="SelectedEarmark" Data="M0,0 L40,0 L40,40 z"  Fill="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}" Stretch="Fill"/>
                                    <Path Data="F1 M133.1,17.9 L137.2,13.2 L144.6,19.6 L156.4,5.8 L161.2,9.9 L145.6,28.4 z" Fill="{ThemeResource ListViewItemCheckThemeBrush}" Height="13" Stretch="Fill" Width="15" HorizontalAlignment="Right" Margin="0,5.5,5.5,0" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
                                </Grid>
                            </Border>
                            <TextBlock x:Name="MultiArrangeOverlayText"
                                       Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TemplateSettings.DragItemsCount}"
                                       Foreground="{ThemeResource ListViewItemDragForegroundThemeBrush}"
                                       FontFamily="{ThemeResource ContentControlThemeFontFamily}"
                                       FontSize="26.667"
                                       IsHitTestVisible="False"
                                       Opacity="0"
                                       TextWrapping="Wrap"
                                       TextTrimming="WordEllipsis"
                                       Margin="18,9,0,0" 
                                       AutomationProperties.AccessibilityView="Raw"/>
                        </Grid>
                    </Border>
                </Grid>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

GridViewItem现在没有显示选择边框,但它仍然可以选择......