WPF Datagrid로 탭하면 첫 번째 셀은 사각형으로 초점을 맞추지 만 파란색으로는 선택하지 않습니다. 탭을 다시 누르면 초점이 이고이 선택됩니다.어떻게하면 WPF Datagrid가 처음으로 셀을 선택했을 때 셀을 선택하게합니까?
실제로 DataGridCell에는 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가 선택되었습니다.
도움을 주시면 감사하겠습니다.
업데이트 : selectedIndex의이 첫 번째 행 지금은 파란색으로 선택입니다 생성시 0으로 설정되어있는 경우 SelectionUnit = FullRow, 나는, 아래의 라인을 따라 약간의 성공이 있었다
. Shift-Tab 등을 처리하는 데는 여전히 약간의 작업이 필요합니다. SelectionMode를 확장 및 Shift-downarrow로 변경하면 두 번째 행이 선택되지만 첫 번째 행은 선택 취소됩니다 (둘 다 선택해야 함) . 만약 내가 다시 그것을 행 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);
}
}
당신은 hasfocus를 사용해야하지만 긍정적 인 답변이 아니므로 대답으로 게시하지 않을 것이라고 생각합니다. – Paparazzi
흥미롭게도, 디버깅하는 동안'DataGrid'의 속성을 스누핑하려고 시도하는 중에'StackOverflowException'이 발생합니다. –