سؤال

لدي WPF أدوات datagrid مع mulitple الأعمدة.أنا أحاول الحصول على السلوك حيث يمكنك التبويب في الشبكة باستخدام علامة التبويب ، ثم علامة التبويب مرة أخرى باستخدام علامة تبويب واحدة.E. g.أنا لا أريد أن التبويب من خلال جميع أعمدة أو خلايا الشبكة مرة واحدة فقط في مرة واحدة.

هل هناك حل بسيط ، لقد حاولت وضع TabNavigation إلى مرة واحدة ، جنبا إلى جنب مع تعطيل TabStop (لا هو موضح في البرمجية أدناه) ووضع TabNavigation على الأعمدة إلى لا شيء ، ولكن من دون نجاح.

هل هناك شيء أنا في عداد المفقودين أو هل أنا بحاجة إلى التعامل مع التبويب الرئيسية في الكود ؟

        <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>
هل كانت مفيدة؟

المحلول

انها مثيرة للاهتمام أن تحديد KeyboardNavigation مباشرة على DataGridTextColumn لا يعمل.بديلا ينبغي العمل على إعداد DataGridCell النمط.

<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>

ربط هذا إلى DataGrid سوف تضمن أن خلية فقط TabStop إذا كان محددا بالفعل.ومع ذلك ، إذا كنت تقوم بتحديد كامل الصفوف و لا SelectionUnit="الخليوي" على DataGrid ، فإنه سوف لا تزال دورة خلال كل عمود حاليا الصف المحدد.

بدلا من ذلك, يمكننا إنشاء عدة CellStyles الموارد في DataGrid:

<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>

الآن لدينا أسلوب يجري تطبيقها على جميع DataGridCells بشكل افتراضي إيقاف TabStop ، مرتبطا النمط الذي يسمح التحديد عند الخلية (أو صف كامل) هو المحدد.تطبيق هذا النمط فقط عمود واحد سوف تعطينا نفس واحدة-في علامة التبويب تأثير بينما يسمح الصف كله و كل من الأعمدة التي سيتم اختيارها.

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

هذا يعني أيضا إيقاف الجدولة في DataGrid إذا كان أي شيء هو اختيار ، والتي قد يكون من المفضل أم لا اعتمادا على الوضع الذي يتم استخدامه في.

نصائح أخرى

شكرا لك rmoore.للحصول على علامة التبويب وقف إلى تعطيل الأعمدة أخذت ردك و تعديله قليلا ؛

     <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>

لذا الحيل ؛

  1. SelectionUnit="FullRow" يجعل واجهة المستخدم الرسومية تبدو وكأنها كنت تفعل الأشياء صف واحد في وقت واحد (مثل أردت).
  2. بإضافة CellStyle إلى أعمدة أريد أن تعطيل TabStop في (ولكن ليس بما في ذلك في تلك وأود أن تتوقف في) سمح لي أن السيطرة على الخلايا التي tab-المفتاح انتقل إلى. ـ KeyboardNavigation.TabNavigation لا وجود تأثير عندما تعرف على الأعمدة.

أعرف أن هذا هو حقا السؤال القديم, ولكن أنا نشر هذا هنا في حالة أنه يساعد شخص ما.في حين قبلت الجواب هو جيد, أنا لا أعتقد أنه يغطي حالة حيث هناك عنصر تحكم آخر على نفس النافذة التي ترغب في علامة التبويب DataGrid من تلك السيطرة.بالإضافة إلى ذلك ، قد ترغب في السلوك كما هو موضح في السؤال الأصلي (تبويب واحدة في تبويب واحدة من خلال الجدولة الخلايا/أعمدة).هذا الحل يهدف إلى تحقيق هذا الهدف.

ملاحظة: هذا الحل هو افتراض كنت تريد الخاص بك SelectionUnit أن يكون FullRow في DataGrid.

أولا هنا Style لتطبيق DataGrid:

<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>

هذا النمط يسمح التركيز على الصفوف ولكن يمنع التركيز على الخلايا الفردية ، والتي تحافظ على تركيز يتفق مع SelectionUnit من FullRow.الزناد مجموعة داخل هذا النمط هو اختياري - فإنه يحتاج فقط إذا كنت تريد تلقائيا حدد الصف عندما يتلقى التركيز.

في حال أردت تبويب واحدة في / الخروج السلوك, لذلك أنا أيضا تعيين KeyboardNavigation.TabNavigation مكان الإقامة على DataGrid = "مرة واحدة".

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

مع هذا النهج لا يزال يمكنني استخدام أعلى/لأسفل مفاتيح الأسهم للتنقل بين الصفوف مرة واحدة DataGrid يتلقى التركيز, ولكن لا يزال يمكنني التبويب بسرعة إذا كنت ترغب في نقل التركيز إلى عنصر التحكم التالي في ترتيب علامات التبويب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top