【问题标题】:DataGrid CellTemplate TabNavigationDataGrid CellTemplate TabNavigation
【发布时间】:2013-09-13 05:14:39
【问题描述】:

我假设之前有人问过这个问题,但我找不到它,所以如果它与其他措辞或其他内容重复,请告诉我。

问题在于包含多个 CellTemplate 的 SL4 DataGrid,包括 CheckboxButton 等。默认情况下,它只会在第一行中的这些元素之间切换。如果我设置TabNavigation="Cycle",它将通过所有元素进行选项卡,但它不会移动到下一个元素,而是通过相同的DataGrid 重新迭代选项卡。

如果我将它设置为Once,那么它只会在第一行中使用标签...。SL4 似乎没有Continue 选项,一旦它到达边缘就可以移动到下一个对象。

我正在寻找一种简单的方法来获取 TabNavigation="Cycle" 的等价物,除非它到达 DataGrid 中的最后一个可制表元素,然后它会移动到树中的下一个元素,而不仅仅是制表符再次回到DataGrid 中的第一个元素。我在这里错过了什么?

【问题讨论】:

  • 这是 Silverlight 的可用性问题,因为 Silverlight 中没有 WPF 的“继续”等效项。 DataGrid 中的“Cycle”选项按“预期”工作,因为导航将仅为您的控件启用,返回到 DataGrid 中的第一个元素。有一个thread 可能对你有帮助。

标签: c# silverlight xaml datagrid


【解决方案1】:

很久以前,我在 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 中使用的代码。

希望此解决方案在您退出数据网格和反向选项卡进入数据网格时对您都有效。

【讨论】:

    【解决方案2】:

    在 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);
            }
        }
    

    【讨论】:

    • 是的,设置单元格编辑不是问题,因为您可以为他们双击时指定一个编辑模板,或者如果他们只是从第一个模板开始,他们可以通过 datagrid 的元素进行标记.问题仍然存在于选项卡在哪里/应该从一行到另一行,从左到右传递到最后一个单元格,然后它应该将选项卡焦点传递给树中的下一个控件。我希望我不必弄清楚如何在最后一个单元格中监听焦点,然后手动将其传递给下一个控件。就像我说的“循环”工作正常,但它并没有通过它。
    • 我只在推进所选项目后设置单元格编辑。我将按键事件放在数据网格本身上,而不是最后一个单元格上。
    • 那么如何通过 tab 键将焦点传递到数据网格之后的树中的下一个控件?
    • 我刚刚用我的整个测试更新了我的答案。我没有在数据网格上设置 TabIndex,在我最后一个单元格选项卡之后,光标移到了我的最后一个文本框中。我应该在前面提到,我使用的是 SL 5。
    • 啊,我还没有在 SL5 上玩过它,只是在 SL4 上玩过,但也许我可以将其中的一部分应用到我的困境中,还得研究一下。到目前为止,我还不能直观地将它传递给下一个控件。
    猜你喜欢
    • 2013-09-24
    • 2021-12-30
    • 2021-03-23
    • 2012-09-15
    • 2010-10-24
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多