2

我正在使用 MVVM 模式开发 WPF 应用程序,但我遇到了焦点问题。

我在“叠加层”上有全屏幻灯片,在每个叠加层中我都有一个 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 完成),但我遇到的问题是我似乎无法让键盘焦点转到相关视图上的第一个可聚焦元素,无论它可能是什么。

我以为我在这里找到了我需要的东西,但是当使用此代码遍历可视化树时,似乎将 ContentPresenter (OverlayContent)传递给 VisualTreeHelper.GetChildrenCount() 时它没有返回任何子级,因此它无法向下动态视图中的元素。

我还尝试将OverlayContainer设置为活动焦点范围,然后调用:

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

但这也没有用。

我试图显示的所有视图中至少有 1 个可聚焦、可见、启用的元素。

有任何想法吗?

4

1 回答 1

1

看起来 Rachel 是第一个 - 原来是视图还没有渲染,所以子视觉元素还不可用。像这样调用我的调焦器:

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

允许我访问所有子视觉元素并相应地设置焦点。

于 2012-08-03T15:46:58.720 回答