2

我想这已经被问过但我找不到它,所以让我知道它是否与其他措辞或其他东西重复。

问题出在包含多个 CellTemplate 等的 SL4 DataGrid 上CheckboxButton默认情况下,它只会在第一行上的这些元素中使用标签。如果我设置TabNavigation="Cycle"它,它将通过所有元素制表符,但它不会移动到下一个元素,而只是通过相同的 DataGrid 重新迭代制表符。

如果我Once再次将其设置为 then ,它将仅通过第一行进行制表符......并且 SL4 似乎没有Continue选项可以在到达边缘后移动到下一个对象。

我正在寻找一种简单的方法来等效于TabNavigation="Cycle"当它到达最后一个可选项卡元素时,DataGrid它会移动到树中的下一个元素,而不是仅仅返回到第一个元素DataGrid。我在这里想念什么?

4

2 回答 2

1

在 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-09T20:46:07.333 回答
0

很久以前,我对 SL4 有一些经验。我会试试你的问题:

查看您设置的属性以获得所需的行为将不起作用。这将只是微软的方式,因此替代方法是编写自己的代码来实现所需的行为。

我的想法是将以下事件附加到每个数据网格单元格:

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 中使用的代码。

当您从数据网格中跳出标签并在数据网格中反转标签时,希望此解决方案对您双方都有效。

于 2013-12-12T06:08:21.800 回答