コードからGridViewColumnHeaderのDataTemplate内の要素(TextBlock)にアクセスするにはどうすればよいですか???? 列ヘッダーにフォーカスを設定したいと思います。
1590 次
1 に答える
1
任意の GridViewColumnHeader または特定の 1 つだけですか? このコードを使用できます
List<GridViewColumnHeader> allGridViewColumnHeaders = GetVisualChildCollection<GridViewColumnHeader>(listView);
foreach (GridViewColumnHeader columnHeader in allGridViewColumnHeaders)
{
TextBlock textBlock = GetVisualChild<TextBlock>(columnHeader);
if (textBlock != null)
{
}
}
そしてヘルパーメソッド
public List<T> GetVisualChildCollection<T>(object parent) where T : Visual
{
List<T> visualCollection = new List<T>();
GetVisualChildCollection(parent as DependencyObject, visualCollection);
return visualCollection;
}
private void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : Visual
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (child is T)
{
visualCollection.Add(child as T);
}
else if (child != null)
{
GetVisualChildCollection(child, visualCollection);
}
}
}
private T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
アップデート
GridViewColumnHeader にフォーカスを与えるには、次のことができます
columnHeader.Focus();
これを行う場所によっては、うまくいかない場合があります。
EventHandler eventHandler = null;
eventHandler = new EventHandler(delegate
{
listView.LayoutUpdated -= eventHandler;
GridViewColumnHeader columnHeader = GetVisualChild<GridViewColumnHeader>(listView);
columnHeader.Focus();
});
listView.LayoutUpdated += eventHandler;
また、GridViewColumnHeader に次の属性があることを確認してください
<GridViewColumnHeader IsTabStop="True" Focusable="True">
于 2010-10-29T11:29:19.760 に答える