2010-11-15 31 views
1

我有一個ItemsControl,它綁定到數據源並生成多個容器。我使用代碼來確保在任何給定時間只有一個容器可見。容器使用TemplateSelector,因此每個容器的內容都不相同(這排除了按名稱查找控件)。WPF:將焦點設置爲ItemsControl中的控件

我想將鍵盤焦點設置爲當前可見容器中的第一個控件。我爲每個容器的IsVisibleChanged事件添加了一個事件處理程序,但是當我訪問VisualTree時,沒有孩子。

任何想法?

回答

0

只有在子元素本身變爲可見狀態後,才能將焦點設置在子元素上。一種選擇是找到您想要關注的子元素,然後在其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); 
} 
+0

我的問題是找到子元素。我擁有的是一個ContentPresenter,它應該擁有來自所選模板的控件,但它的可視化樹似乎沒有子節點。 – Jim 2010-11-17 14:05:05

+0

我用一些訪問項目集合的代碼編輯了答案。我已經測試過這一點,它的工作原理 - 我意識到它與你所描述的不同,但我原以爲這個概念是一樣的。我應該刪除我的答案,以便您有更好的機會獲得答覆嗎? – 2010-11-17 22:13:33