所以我有大量的控件(文本框),如下所示,但是大约有30行。这些是使用数组加载的,每列代表一个数组。因此,当我在文本框中点击标签时,而不是水平标签,而是垂直标签。
除了更改控件的加载方式之外,还有办法设置标签顺序,使其水平标注吗?
另一个怪癖是,当离开一个文本框时,而不是聚焦下一个文本框,它只是突出显示文本框,我必须第二次标记进入下一个文本框。
修改
主视图(许多代码已被省略,我很确定没有遗漏任何东西需要在这里)
<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的新手)。
答案 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()