Frage

habe ich ein WPF Toolkit Datagrid mit mulitple Spalten. Ich versuche, ein Verhalten zu bekommen, wo Sie mit der Tabulatortaste in das Netz Reiter können, dann auf das Register wieder heraus einen einzelnen Reiter. Z.B. Ich will nicht, um durch alle Spalten oder Zellen des Gitters, nur einmal in und einmal aus.

Gibt es eine einfache Lösung, ich habe versucht, die TabNavigation Einstellung einmal zusammen mit Deaktivierung TabStop (im Folgenden nicht im Code gezeigt) und Einstellung TabNavigation auf den Säulen zu None, aber ohne Erfolg.

Gibt es etwas, was ich bin fehlt oder muss ich die Tab-Taste in Code behandeln?

        <my:DataGrid Name="datagrid"
                     AutoGenerateColumns="False" IsReadOnly="True"
                     CanUserAddRows="False" CanUserDeleteRows="False"
                     Background="White"
                     KeyboardNavigation.TabNavigation="Once">
            <my:DataGrid.Columns>
                <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" ></my:DataGridTextColumn>
                <my:DataGridTextColumn x:Name="Ticker" Header="Ticker" Width="1*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn>
                <my:DataGridTextColumn x:Name="OfficialName" Header="Name" Width="3*" KeyboardNavigation.TabNavigation="None"></my:DataGridTextColumn>
            </my:DataGrid.Columns>
        </my:DataGrid>
War es hilfreich?

Lösung

Es ist interessant, dass die KeyboardNavigation Einstellung direkt auf dem Datagridtextcolumn der nicht funktioniert. Eine Alternative, die funktionieren sollte, ist ein Datagridcell-Stil einzurichten.

<toolkit:DataGrid.CellStyle>
    <Style TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="KeyboardNavigation.IsTabStop"
                Value="False" />
        <Style.Triggers>
            <Trigger Property="IsSelected"
                     Value="True">
                <Setter Property="KeyboardNavigation.IsTabStop"
                        Value="True" />
            </Trigger>
        </Style.Triggers>
    </Style>
</toolkit:DataGrid.CellStyle>

Anbringen an das Datagrid wird sichergestellt, dass eine Zelle ist nur ein TabStop wenn es bereits ausgewählt ist. Wenn Sie jedoch volle Reihen auswählen und nicht SelectionUnit = „Cell“ Set auf dem Datagrid, wird es noch Zyklus durch jede Spalte der aktuell ausgewählte Zeile hat.

Stattdessen können wir mehrere angewendete Cellstyles als Ressourcen innerhalb des Datagrid erstellen:

<toolkit:DataGrid.Resources>

    <Style  x:Key="SelectableCellStyle"
            TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="KeyboardNavigation.IsTabStop"
                Value="False" />
        <Style.Triggers>
            <Trigger Property="IsSelected"
                     Value="True">
                <Setter Property="KeyboardNavigation.IsTabStop"
                        Value="True" />
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style TargetType="{x:Type toolkit:DataGridCell}">
        <Setter Property="KeyboardNavigation.IsTabStop"
                Value="False" />
    </Style>

</toolkit:DataGrid.Resources>

Jetzt haben wir einen Stil auf alle DataGridCells standardmäßig angewendet werden und Ausschalten TabStop und ein Schlüssel Stil, der Auswahl erlaubt, wenn die Zelle (oder eine ganze Reihe) ausgewählt ist. Die Anwendung dieser Art auf nur einer einzigen Spalte wird uns die gleiche Single-tab-in-Effekt, während die ganze Reihe ermöglicht und alle Spalten es die ausgewählt werden.

 <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" CellStyle={StaticResource  SelectableCellStyle}"/>

Das hält auch in die Datagrid-Tabbing wenn nichts ausgewählt ist, die bevorzugt werden können oder nicht in Abhängigkeit von der Situation, die Sie es in verwenden.

Andere Tipps

Danke rmoore. Um die Tabstopp zu bekommen für Spalten deaktiviert habe ich Ihre Antwort und modifiziert es leicht;

     <my:DataGrid Name="datagrid" 
                 AutoGenerateColumns="False" IsReadOnly="True" 
                 CanUserAddRows="False" CanUserDeleteRows="False" 
                 Background="White" 
                 KeyboardNavigation.TabNavigation="Once"
                 SelectionUnit="FullRow"> 
        <my:DataGrid.Columns> 
            <my:DataGridTextColumn x:Name="ID" Header="ID" Width="1*" ></my:DataGridTextColumn> 
            <my:DataGridTextColumn x:Name="Ticker" Header="Ticker" Width="1*">
                    <my:DataGridTextColumn.CellStyle>
                        <Style TargetType="{x:Type my:DataGridCell}">
                            <Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter>
                        </Style>
                    </my:DataGridTextColumn.CellStyle>
            </my:DataGridTextColumn> 

            <my:DataGridTextColumn x:Name="OfficialName" Header="Name" Width="3*">
                  <my:DataGridTextColumn.CellStyle>
                        <Style TargetType="{x:Type my:DataGridCell}">
                            <Setter Property="KeyboardNavigation.IsTabStop" Value="False"></Setter>
                        </Style>
                  </my:DataGridTextColumn.CellStyle>
            </my:DataGridTextColumn> 
        </my:DataGrid.Columns> 
    </my:DataGrid>

So Tricks;

  1. SelectionUnit = „FullRow“ macht die GUI aussehen wie Sie die Dinge eine Zeile zu einem Zeitpunkt tun (wie ich wollte).
  2. Durch eine Cellstyle zu den Spalten hinzufügen I zu deaktivieren TabStop möchte (aber einschließlich nicht in denen, würde Ich mag stoppen in) erlaubt mir die Kontrolle zu übernehmen, welche Zellen die Tab-Taste in navigieren würde. -. Die KeyboardNavigation.TabNavigation keine Wirkung, wenn sie auf Spalten definiert

Ich weiß, dass dies eine wirklich alte Frage, aber ich bin Entsendung hier dies, falls es hilft jemand. Während die akzeptierte Antwort gut ist, glaube ich nicht, es behandelt den Fall, wo eine andere Steuerung auf dem gleichen Fenster gibt es, und Sie würden von dieser Kontrolle in die DataGrid auf die Registerkarte mögen. Darüber hinaus können Sie das Verhalten wollen wie in der ursprünglichen Frage (einzelne Registerkarte in Einzel Registerkarte aus, ohne Tabbing durch Zellen / Spalten) beschrieben. Diese Lösung Ziele dieses Ziel zu erreichen.

. Hinweis: Diese Lösung wird vorausgesetzt, Sie Ihre SelectionUnit wollen FullRow in Ihrem DataGrid sein

Als erstes ist hier die Style zum DataGrid anwenden:

<DataGrid.Resources>
    <Style TargetType="DataGridRow">
        <Style.Setters>
            <Setter Property="Focusable" Value="True"/>
        </Style.Setters>
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="True">
                <Setter Property="IsSelected" Value="True"/>
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style TargetType="DataGridCell">
        <Style.Setters>
            <Setter Property="Focusable" Value="False"/>
        </Style.Setters>
    </Style>
</DataGrid.Resources>

Mit dieser Art Fokus auf Reihen aber verhindert konzentrieren sich auf einzelne Zellen, die den Fokus im Einklang mit der SelectionUnit von FullRow halten. Das Trigger-Set in diesem Stil ist optional -. Es nur, wenn Sie automatisch möchten benötigt wird, um die Zeile auszuwählen, wenn es den Fokus erhält

In meinem Fall habe ich die einzelnen Register in / Tab out Verhalten wollte, so dass ich die KeyboardNavigation.TabNavigation Eigenschaft auf meinem DataGrid auch gesetzt = "einmal."

<DataGrid SelectionUnit="FullRow" KeyboardNavigation.TabNavigation="Once">

Mit diesem Ansatz kann ich immer noch das aufbrauchen / Ab-Taste, um durch die Reihen Pfeil, sobald die DataGrid Fokus erhält, aber ich kann schnell noch Tab aus, wenn ich will den Fokus auf das nächste Steuerelement in der Tab-Reihenfolge bewegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top