我假设之前有人问过这个问题,但我找不到,所以请让我知道这是不是与其他词语或其他东西重复发现的。
问题出在SL4 DataGrid,它包含多个CellTemplate,包括Checkbox、Button等。默认情况下,它只会在第一行切换这些元素。如果我设置了TabNavigation="Cycle",它将切换到所有元素,但它不会移动到下一个元素,而只是在相同的DataGrid中重复切换。
如果我将其设置为Once,那么它将再次仅在第一个row....and SL4上切换,当它到达边缘时,似乎没有Continue选项移动到下一个对象上。
我正在寻找一种简单的方法来获取TabNavigation="Cycle"的等价物,除了当它到达DataGrid中最后一个可用tab键的元素时,它会移动到树中的下一个元素,而不是再次返回到DataGrid中的第一个元素。这里我漏掉了什么?
发布于 2013-12-10 04:46:07
在Silverlight中似乎没有一种原生的方法来做到这一点,以下是数据网格控件中支持的键击的列表:http://msdn.microsoft.com/en-us/library/cc838112(v=vs.95).aspx
我可以通过使用KeyDown事件并检查Tab,然后手动设置编辑单元格来伪造它:
<Grid x:Name="LayoutRoot" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Text="Some text" />
<sdk:DataGrid Grid.Row="1" ItemsSource="{Binding People}" AutoGenerateColumns="False" KeyDown="DataGrid_KeyDown">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding FirstName}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding LastName}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellEditingTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
<TextBox Grid.Row="2" Text="Some more text" />
</Grid>
private void DataGrid_KeyDown(object sender, KeyEventArgs e)
{
DataGrid dg = (DataGrid)sender;
ObservableCollection<Person> items = dg.ItemsSource as ObservableCollection<Person>;
if (e.Key == Key.Tab && dg.SelectedIndex < items.Count -1)
{
dg.SelectedIndex++;
dg.CurrentColumn = dg.Columns[0];
dg.BeginEdit();
var cell = dg.CurrentColumn.GetCellContent(dg.SelectedItem);
}
}发布于 2013-12-12 14:08:22
很久以前,我和SL4有过一些经验。我会试一试你的问题:
看看你为获得你想要的行为而设置的属性将不起作用。这将只是Microsoft的方式,因此替代方案是编写您自己的代码来实现所需的行为。
我的想法是将以下事件附加到每个datagrid单元格:
private void DataGridCell_KeyDown(object sender, KeyEventArgs e)
{
if (keypressed == 'TAB' && last cell of the datagrid)
{
e.handled=true;
int tabIndex = dg.TabIndex;
tabindex++;
Control control = GetControl(tabIndex); // You can use visual tree in the method to get it
control.select();
control.focus();
}
}很抱歉,我写了伪代码,而不是真正的代码,因为我需要时间来回忆我在SL中使用的代码。
当你跳出数据网格和反转到数据网格时,我希望这个解决方案对你两方面都有效。
https://stackoverflow.com/questions/18702916
复制相似问题