WPF - 在大量控件上设置Tab键顺序

时间:2016-02-08 18:34:50

标签: c# wpf

所以我有大量的控件(文本框),如下所示,但是大约有30行。这些是使用数组加载的,每列代表一个数组。因此,当我在文本框中点击标签时,而不是水平标签,而是垂直标签。

除了更改控件的加载方式之外,还有办法设置标签顺序,使其水平标注吗?

另一个怪癖是,当离开一个文本框时,而不是聚焦下一个文本框,它只是突出显示文本框,我必须第二次标记进入下一个文本框。

enter image description here

修改
主视图(许多代码已被省略,我很确定没有遗漏任何东西需要在这里)

<ListBox ItemsSource="{Binding Items}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">   
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel IsItemsHost="True" />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

ItemsView

<UserControl>
  <UserControl.Resources>
    <DataTemplate DataType="{x:Type vm:Item}">
      <views:ItemView/>
    </DataTemplate>
  </UserControl.Resources>

  <StackPanel>
    <ContentControl Content="{Binding item <!-- about 30 different items here, omitted for readability -->}" />
  </StackPanel>
</UserControl>

ItemView控件

<UserControl ... IsTabStop="False">
  <TextBox Text="{Binding Value}" />
</UserControl>

ItemView嵌套在ItemsView中,它嵌套在MainView中。由于文本框是根据数组值生成的,因此我无法轻松设置TabIndex属性,除非有一种我不了解的方式(我是WPF的新手)。

1 个答案:

答案 0 :(得分:1)

TabIndex property提供了一种控制标签顺序的方法,与加载的顺序控件无关。

用法示例:

<Grid>
    <TextBox TabIndex="2" /><!-- will receive focus second -->
    <TextBox TabIndex="1" /><!-- will receive focus first-->
</Grid>

我猜你所看到的不需要的聚焦是由于你的TextBox被放入的父UserControl所致。

如果是这种情况,您可以通过在该父控件上设置IsTabStop="false"来阻止这种情况。

例如:

<UserControl .... IsTabStop="False">
    <Grid>
        <!-- other graphics -->
        <TextBox TabIndex="1" />
    </Grid>
</UserControl>

使用视图模型填充数据

public class CellViewModel
{
    public double Value { get; set; }
    public int TabIndex { get; set; }
}

public IEnumerable<IEnumerable<CellViewModel>> GetMatrix(
    List<List<double>> matrixValues)
{
    var columnCount = matrixValues.Count;
    return matrixValues
        .Select((x, i) => GetColumn(x, columnCount, i));
}

public IEnumerable<CellViewModel> GetColumn(
    List<double> columnValues,
    int columnCount,
    int columnIndex)
{
    return columnValues
        .Select((x, i) =>
            new CellViewModel { Value = x, TabIndex = columnIndex + columnCount * i });
}

ItemsSource(您现在已更改为ListBox)的ItemsControl应该是新的Matrix媒体资源,您使用{{1}填充该属性}}

在你的ItemView中,你会想要这样的东西:

GetMatrix()