【问题标题】:WPF how to prevent focus wrap on several buttons?WPF如何防止焦点包裹在几个按钮上?
【发布时间】:2020-06-17 00:27:19
【问题描述】:

我很好奇是否有人知道是否可以在一系列按钮上防止“焦点环绕”。如果我只是像这样在 WPF 中的网格中添加几个按钮:

<Window x:Class="ButtonList_Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ButtonList_Test"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel x:Name="myStackPanel" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Grid x:Name="myGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>

            <Button Grid.Column="0" Grid.Row="0">A</Button>
            <Button Grid.Column="1" Grid.Row="0">B</Button>
            <Button Grid.Column="2" Grid.Row="0">C</Button>
            <Button Grid.Column="3" Grid.Row="0">D</Button>
            <Button Grid.Column="4" Grid.Row="0">E</Button>

        </Grid>
    </StackPanel>
</Window>

然后运行程序,它会在一个漂亮的单行中生成 5 个小按钮。

如果我单击中间的按钮 (C),然后开始使用任何键盘箭头键,您会注意到焦点将开始沿着您按下的键的方向遍历这些按钮。

如果虚线到达“E”按钮,并且我再向右按一次,它将返回到“A”按钮。

有没有办法阻止这个功能?

提前感谢您提供的任何见解,

【问题讨论】:

    标签: wpf button focus


    【解决方案1】:

    你可以试试Focusable="False"。据我所知,只有Focusable="True"控件组才能使用箭头键或Tab键遍历控件。

    例如,如果你尝试

    <Button Grid.Column="0" Grid.Row="0">A</Button>
    <Button Grid.Column="1" Grid.Row="0">B</Button>
    <Button Grid.Column="2" Grid.Row="0" Focusable="False">C</Button>
    <Button Grid.Column="3" Grid.Row="0">D</Button>
    <Button Grid.Column="4" Grid.Row="0">E</Button>
    

    然后单击B然后按右键,D将被聚焦。所以如果你想阻止每一次遍历,你可以给每一个Buttons设置Focusable="False"

    【讨论】:

    • 感谢 Ryu 抽出时间回复。这不是我的问题的确切解决方案,因为我确实希望按钮是可聚焦的,而不是当它们可以环绕时。但是,使用此信息,可以计算何时将 Focusable 切换为 False,当您不想要环绕时,何时切换回 True。再次感谢。
    【解决方案2】:

    将所有按钮的IsTabStop 属性设置为false 或定义一个隐式Style 为所有按钮设置此属性:

    <StackPanel x:Name="myStackPanel" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Grid x:Name="myGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.Resources>
                <Style TargetType="Button">
                    <Setter Property="IsTabStop" Value="False" />
                </Style>
            </Grid.Resources>
    
            <Button Grid.Column="0" Grid.Row="0">A</Button>
            <Button Grid.Column="1" Grid.Row="0">B</Button>
            <Button Grid.Column="2" Grid.Row="0">C</Button>
            <Button Grid.Column="3" Grid.Row="0">D</Button>
            <Button Grid.Column="4" Grid.Row="0">E</Button>
    
        </Grid>
    </StackPanel>
    

    【讨论】:

    • 感谢 mm8 抽出时间回复。与 Ryu 的回答类似,这不是一个精确的解决方案。我确实希望按钮是可聚焦的,但不是当焦点环绕到另一侧时。但是,我可能会使用此信息来计算我希望某些按钮何时将 IsTabStop 设置为 True,以及其他时间何时设置为 False。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多