2012-08-02 74 views
2

我正在使用MVVM模式處理WPF應用程序,並且遇到焦點問題。無法在WPF MVVM應用程序中動態設置焦點

我在'overlays'和每個覆蓋內全屏幕幻燈片我有一個ContentPresenter,我用它來顯示任意視圖模型/視圖通過數據綁定它的內容到我在我的數據上下文中設置的視圖模型屬性,像這樣:

<Grid Name="OverlayContainer" 
     FocusManager.IsFocusScope="True" 
     KeyboardNavigation.TabNavigation="Cycle" 
     IsEnabled="False"> 

    <Grid.RenderTransform> 
    <TranslateTransform x:Name="OverlayContainerTransform" 
         X="{Binding ElementName=OverlayContainer, Path=ActualWidth}" 
         Y="0"/> 
    </Grid.RenderTransform> 

    <ContentPresenter x:Name="OverlayContent" Content="{Binding Path=OverlayViewModel"/> 

</Grid> 

然後我就可以動態地在需要時設置OverlayViewModel性質不同的視圖模型和使用數據模板,讓WPF自動顯示相關的視圖模型正確的觀點:

<DataTemplate DataType="{x:Type ViewModels:AuthorisatonViewModel}"> 
    <Views:AuthorisatonView/> 
</DataTemplate> 

當我更改我的視圖模型並在疊加層上滑動時,我將焦點範圍設置爲疊加焦點範圍(我似乎可以使用OverlayContainer.Focus確定),但是我遇到的問題是我可以' t似乎將鍵盤焦點轉移到相關視圖上的第一個可調焦元素,無論它是什麼。

我想我找到了我需要here,但使用此代碼走可視化樹似乎當經過ContentPresenter(OverlayContent)到VisualTreeHelper.GetChildrenCount()時,它返回沒有孩子,所以它無法弄清動態視圖中的元素。

我也嘗試設置OverlayContainer作爲活動的重點範圍,然後調用:

OverlayContainer.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)) 

但也未能上班。

我試圖顯示的所有視圖都有至少1個可調焦,可見,啓用的元素。

任何想法?

+3

也許嘗試在「DispatcherPriority.Render」以後的[DispatcherPriority](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx)導航Visual Tree?當您嘗試設置焦點時,有可能無法呈現控件,因此這會讓他們有時間首先渲染。 – Rachel 2012-08-03 12:50:02

+0

是的,工作的一種享受 - 非常感謝你:D – 2012-08-03 15:47:35

回答

1

Rachel看起來是第一個 - 事實證明,這個視圖還沒有呈現出來,所以兒童視覺元素還沒有出現。調用我的調焦器像這樣:

// Focus on first child element only once rendered 
this.OverlayContainer.Dispatcher.BeginInvoke(DispatcherPriority.Render, 
              new Action<FrameworkElement>(Focuser.FocusOnFirstFocusableChild), 
              this.OverlayContainer); 

允許我訪問所有的兒童視覺元素並相應地設置焦點。