2011-12-05 9 views
8

जब मैं WPF डेटाग्रिड में टैब करता हूं तो यह पहले सेल (आयताकार के साथ) पर केंद्रित होता है लेकिन इसे (नीले रंग में) नहीं चुनता है। यदि मैं फिर से टैब दबाता हूं तो यह और पर केंद्रित करता है।जब आप पहली बार इसमें टैब करते हैं तो WPF डेटाग्रिड एक सेल का चयन कैसे करते हैं

मुझे लगता है कि डेटाग्रिडसेल वास्तव में IsSelected = true है, लेकिन इसे नीले रंग में चित्रित नहीं किया जा रहा है। मैंने डेटाग्रिड और विजुअल-स्टेटस के साथ हैकिंग करने की कोशिश की है, लेकिन जब आप पहली बार टैब करते हैं तो मैं ग्रिड को सही ढंग से पुन: पेश नहीं कर सकता।

क्या किसी ने इसे पहले देखा है और क्या आपके पास समाधान है?

कोड पुन: पेश करने:

MainWindow.xaml पाठ बॉक्स पर

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
     <TextBox Width="100"/> 
     <DataGrid SelectionMode="Single" SelectionUnit="Cell" 
       ItemsSource="{Binding MyItems}" AutoGenerateColumns="True"/> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs

using System.Collections.Generic; 
using System.Windows; 

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      MyItems.Add(new Thingy() { Name = "Frank", Age = 34 }); 
      MyItems.Add(new Thingy() { Name = "Jim", Age = 43 }); 
      MyItems.Add(new Thingy() { Name = "Bob", Age = 56 }); 
      MyItems.Add(new Thingy() { Name = "Harry", Age = 23 }); 

      DataContext = this; 
     } 

     private List<Thingy> _myItems = new List<Thingy>(); 
     public List<Thingy> MyItems 
     { 
      get { return _myItems; } 
     } 
    } 

    public class Thingy 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 
} 

क्लिक करें, फिर टैब मारा --- सेल 1 चयनित नहीं है

हिट टैब फिर से --- सेल 2 चुना गया है

किसी भी मदद की बहुत सराहना की है, धन्यवाद।

अद्यतन:

जब SelectionUnit = FullRow, मैं नीचे दिखाया गया पंक्तियों के साथ कुछ सफलता, अगर SelectedIndex निर्माण पहली पंक्ति अब नीले रंग में चयनित है पर 0 पर सेट है पड़ा है। इसे अभी भी शिफ्ट-टैब इत्यादि से निपटने के लिए कुछ काम की ज़रूरत है। अभी भी एक समस्या है क्योंकि जब मैं चयन मोड को विस्तारित करता हूं और शिफ्ट-डाउनारो दबाता हूं तो दूसरी पंक्ति का चयन किया जाता है लेकिन पहली पंक्ति को अचयनित किया जाता है (उन्हें दोनों का चयन किया जाना चाहिए) । यदि मैं इसे फिर से करता हूं तो पंक्तियां 2 + 3 चयनित होती हैं जो सही होती हैं और इसके बाद ठीक काम करना जारी रहता है।

protected override void OnIsKeyboardFocusWithinChanged(DependencyPropertyChangedEventArgs e) 
    { 
     base.OnIsKeyboardFocusWithinChanged(e); 

     int oldIdx = this.SelectedIndex; 
     this.SelectedIndex = -1; 
     this.SelectedIndex = oldIdx; 
    } 

इसके अलावा अद्यतन:

निजी _selectionAnchor क्षेत्र की स्थापना द्वारा तय कि इस मुद्दे को। (धन्यवाद ILSpy)

protected override void OnIsKeyboardFocusWithinChanged(DependencyPropertyChangedEventArgs e) 
    { 
     base.OnIsKeyboardFocusWithinChanged(e); 

     this.SelectedIndex = -1; 
     this.SelectedIndex = 0; 

     SelectionAnchor = SelectedCells[0]; 
    } 

    protected DataGridCellInfo? SelectionAnchor 
    { 
     get 
     { 
      return typeof(DataGrid).GetField("_selectionAnchor", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this) as DataGridCellInfo?; 
     } 
     set 
     { 
      typeof(DataGrid).GetField("_selectionAnchor", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(this, value); 
     } 
    } 
+0

मुझे लगता है कि आपको हैफोकस का उपयोग करने की आवश्यकता है लेकिन सकारात्मक नहीं है इसलिए मैं उत्तर के रूप में पोस्ट नहीं कर रहा हूं। – Paparazzi

+0

उत्सुकता से, मुझे डीबगिंग के दौरान 'डेटाग्रिड' के गुणों को स्नूप करने का प्रयास करते समय 'StackOverflowException' मिलता है। –

उत्तर

4

आप ऐसा कर सकते हैं। फोकस ईवेंट के लिए पंजीकरण करें और फिर मूल स्रोत को चयनित आइटम के रूप में सेट करें।

<Window x:Class="WpfApplication1.MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="MainWindow" Height="350" Width="525"> 
<StackPanel> 
    <TextBox Width="100"/> 
    <DataGrid SelectionMode="Single" SelectionUnit="Cell" 
      ItemsSource="{Binding MyItems}" AutoGenerateColumns="True" 
      GotFocus="WPF_DataGrid_GotFocus" /> 
</StackPanel> 
</Window> 
कोड में

फिर फ़ाइल के पीछे:

private void WPF_DataGrid_GotFocus(object sender, RoutedEventArgs e) 
    { 
     (e.OriginalSource as DataGridCell).IsSelected = true; 

    } 

मुझे आशा है कि यह मदद करता है!

+0

मैंने वास्तव में डेटाग्रिड नियंत्रण पर छोड़ दिया है और सूची दृश्य में वापस चला गया है जहां इस तरह के व्यवहार पर मेरा अधिक नियंत्रण है। मैं इसे उत्तर के रूप में चिह्नित कर रहा हूं क्योंकि यह सही लगता है और यह केवल मुझे मिला है, धन्यवाद गुरुक! –

+0

यदि 'DataGrid.SelectionUnit'' FullRow' है तो आपको 'e.OriginalSource' से दृश्य पेड़ को चलाने के लिए 'VisualTreeHelper' का उपयोग करना होगा जो माता-पिता' DataGridRow' को 'DataGridCell' है। फिर आपको सेल पर बजाए पंक्ति पर 'IsSelected = true' सेट करना होगा। इसके अलावा यह समाधान काम करता है। –

3

मुझे पता है कि मेरा जवाब बहुत देर हो चुकी है लेकिन इससे इस साइट पर अन्य नेविगेट करने में मदद मिलेगी।

बहुत सारे शोध के बाद, मुझे टैबबिंग करते समय तत्व का चयन करने का उत्तर मिला। यह वास्तव में आसान था और एक्सएएमएल में कोड की एक पंक्ति थी जिसने चाल की थी;

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

गलत पर IsTabStop की स्थापना करके आप datagridcell का दृश्य पेड़ कह रहे हैं अपने टेम्पलेट के अंदर जाने के लिए और किसी भी तत्व है कि सक्षम ध्यान केंद्रित खोजने के लिए। अगर यह कुछ तत्व पाता है तो यह उस तत्व को केंद्रित करता है।

संबंधित मुद्दे

 संबंधित मुद्दे