只有在子元素本身變爲可見狀態後,才能將焦點設置在子元素上。一種選擇是找到您想要關注的子元素,然後在其IsVisibleChanged
中添加處理程序。在處理程序中,將對象聚焦,然後刪除處理程序。
private void stackPanel1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (stackPanel1.IsVisible)
{
UIElement elm = stackPanel1.Children[0];
FrameworkElement fwe = (FrameworkElement)elm;
fwe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fwe_IsVisibleChanged);
}
}
void fwe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
FrameworkElement fwe = (FrameworkElement)sender;
fwe.IsVisibleChanged -= new DependencyPropertyChangedEventHandler(fwe_IsVisibleChanged);
Keyboard.Focus((IInputElement)sender);
}
編輯: 你應該能夠訪問在IsVisibleChanged在事件處理程序的項目集合。
<ItemsControl Name="sp1" IsVisibleChanged="sp1_IsVisibleChanged"
ItemsSource="{Binding Items}" >
</ItemsControl>
有了這個代碼:
void sp1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
Console.WriteLine(sp1.Items.Count);
}
我的問題是找到子元素。我擁有的是一個ContentPresenter,它應該擁有來自所選模板的控件,但它的可視化樹似乎沒有子節點。 – Jim 2010-11-17 14:05:05
我用一些訪問項目集合的代碼編輯了答案。我已經測試過這一點,它的工作原理 - 我意識到它與你所描述的不同,但我原以爲這個概念是一樣的。我應該刪除我的答案,以便您有更好的機會獲得答覆嗎? – 2010-11-17 22:13:33