【问题标题】:UWP remove focus border in a GridviewUWP 删除 Gridview 中的焦点边框
【发布时间】:2016-10-26 13:23:22
【问题描述】:

我对通用 Windows 平台 (UWP) 和 XAML 还是很陌生。

我有一个 GridView,它显示垂直堆叠的数据。这很好,但是当我按住 GridView.ItemTemplate/DataTemplate 之一时,我得到一个灰色边框:

我尝试将这些属性放在各种项目上,但没有成功:

FocusVisualPrimaryThickness="0" 
FocusVisualSecondaryThickness="0" 
FocusVisualPrimaryBrush="Black" 
FocusVisualSecondaryBrush="Black" 
FocusVisualMargin="0"

我也注意到这些属性。这是否意味着它尚未实施?:

这是我的代码:

<GridView x:Name="IconGridView"
                  Canvas.ZIndex="2"
                  Grid.Row="0"
                  Margin="398,728,402,107"
                  ItemClick="Clicked_On_Video_Preview_Image"
                  IsItemClickEnabled="True"
                  IsSwipeEnabled="True"
                  ItemsSource="{x:Bind _videoItems}"
                  ScrollViewer.HorizontalScrollBarVisibility="Auto"
                  ScrollViewer.HorizontalScrollMode="Enabled"
                  ScrollViewer.VerticalScrollMode="Disabled"
                  BorderThickness="0"  
                  SelectionMode="None"
                  BorderBrush="Black"
                  Background="Black" IsHoldingEnabled="False">

            <GridView.ItemsPanel>
                <ItemsPanelTemplate>
                    <ItemsWrapGrid Orientation="Vertical" Background="Black" />
                </ItemsPanelTemplate>
            </GridView.ItemsPanel>

            <GridView.ItemTemplate>
                <DataTemplate x:DataType="model:VideoItem">
                    <StackPanel Margin="30,0,30,0" HorizontalAlignment="Center" BorderThickness="0" BorderBrush="Black" Background="Black" Height="245">
                        <Grid>
                            <Border Name="PreviewBorder" BorderThickness="2" BorderBrush="#000000" Margin="0,55,0,55">
                                <Image Height="135" Width="240" Source="{x:Bind ThumbnailFilename}" Loaded="Video_Preview_Loaded" Stretch="UniformToFill" />
                            </Border>
                            <Image Margin="0,55,0,55" Height="29" Width="29" Source="Assets/play_vit.png" />
                            <TextBlock Margin="0,185,0,0" Text="{x:Bind Title}" CharacterSpacing="200" TextWrapping="WrapWholeWords" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="12" Foreground="white" Width="240" Height="45"/>
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </GridView.ItemTemplate>
        </GridView>

【问题讨论】:

  • 我相信这是GridView默认样式的结果。解决方案是根据原始样式创建自定义样式,修改灰色边框的部分并在所需的 GrdiView 中使用。

标签: c# xaml gridview uwp uwp-xaml


【解决方案1】:

灰色边框是GridViewItem 模板的一部分。如果你想修改它,你需要创建你自己的模板。

您可以通过右键单击设计器中的控件,单击编辑样式,然后单击编辑副本轻松地做到这一点,这将为您提供默认样式和模板可根据您自己的需要进行修改。

就我而言,我根本不想修改模板,只是想摆脱它,所以我只是将模板替换为 ContentPresenter 以仅显示我自己的内容,如下所示:

<Style TargetType="GridViewItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="GridViewItem">
                <ContentPresenter ContentTransitions="{TemplateBinding ContentTransitions}"
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                  Margin="{TemplateBinding Padding}" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

如果您想知道所有这些 TemplateBinding 绑定来自哪里,我只是从默认样式中复制了它们。我本来可以写&lt;ContentPresenter /&gt;,但我更喜欢这样写。

希望这回答了你的问题!

【讨论】:

  • 谢谢。这将删除焦点边框。但是有两个问题(1)常规项目边框也被删除(2)用户需要选择/单击项目文本本身才能选择它(当用户像往常一样选择/单击项目附近或周围时不起作用)
  • 我给出的代码示例删除了除我设置的内容之外的所有内容,这是我个人想做的。按照第二段中的说明获取默认模板,然后根据需要进行修改。
【解决方案2】:

这是当用户使用 TAB 键更改焦点元素时为每个 GridViewItem 显示的焦点视觉对象。您可以移除焦点视觉效果,但现在它会降低您的应用的可访问性,因为人们将无法使用键盘来导航您的 UI(并且叙述者将无法读出焦点项目)。

<GridView.ItemContainerStyle>
    <Style TargetType="GridViewItem">
        <Setter Property="IsTabStop" Value="False" />
    </Style>
</GridView.ItemContainerStyle>

相反,如果你想改变焦点视觉的外观,你需要在每个 GridViewItem 上设置Focus* 属性:

<GridView.ItemContainerStyle>
    <Style TargetType="GridViewItem">
        <Setter Property="FocusVisualPrimaryBrush" Value="Red" />
        <Setter Property="FocusVisualSecondaryBrush" Value="Blue" />
        <!-- etc -->
    </Style>
</GridView.ItemContainerStyle>

【讨论】:

  • 你好十年月亮。谢谢你的回答,但我还是遇到了问题。我应该更清楚。我正在开发一个触摸应用程序。所以不会使用键盘。如果我实施您建议的答案,我仍然会得到相同的结果。虽然当我连接一个 kayboard 并开始使用选项卡时,Focus* 属性就会发挥作用。然后我看到一个红色和蓝色的边框。当我*触摸并按住”一个项目时,我试图禁用焦点边框。
  • 您能否向我确认,如果您应用上述样式,当您触摸并按住时会出现灰色边框,而当您使用 TAB 键时会出现红色/蓝色边框?或者当您触摸并按住时会出现红色边框?如果是后者,那么它仍然是我们正在处理的焦点视觉,否则它可能是别的东西。我没有触摸设备,所以我无法像你那样完全重现它,但我确实在模拟器中运行了它(它确实模拟了触摸)并将 IsTabStop 设置为 false 对我有用。您已将 SelectionMode 设置为 None,所以我不知道还有什么可能导致边框。
  • 正确。当我“触摸并按住”时,我得到灰色边框。当我将键盘和选项卡连接到该项目时,我得到一个红色/蓝色边框。如果我将“IsTabStop”设置为 true,那么我无法使用选项卡转到该项目,但当我“触摸并按住”时仍然有灰色边框。
  • 你有解决方案吗?如何设置 ForcusVisualMargin?我想删除焦点边距
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2021-08-19
  • 2012-11-05
  • 2011-07-25
  • 2012-08-04
相关资源
最近更新 更多