WPF焦点问题:导航后必须在一个视图中单击两次

时间:2019-05-02 01:09:32

标签: wpf focus

我的WPF / Prism / .Net Framework应用程序中有一个焦点问题。当我导航到一个特定的视图时,我被迫在按钮或其他控件上单击两次,然后作出响应。

主窗口有两个列。左侧是导航按钮。右侧是显示视图的ContentControl。所有视图都是UserControls。它使用棱镜和区域导航,尽管我怀疑这无关紧要,因为只有一种视图会引起问题。

enter image description here

  1. 当我第一次导航到该特定视图(“设置”)时,必须先在其中单击一次,然后才能使用任何控件。仅在其第二次单击时,其任何控件才会响应。

  2. 当我单击它的内部后,上的导航面板也发生了同样的问题。然后,我必须在其中单击两次以使导航按钮开始工作。

  3. 其他所有视图都没有出现此问题,尽管它们都使用相同的导航机制。

这是焦点问题,对吗?我已经遍历了我可以在Focus上找到的所有WPF文档(逻辑与键盘,IsFocusScope属性,Focusable属性等),而没有太多的了解。

我也尝试了以下方法

  • 我确保视觉树中没有任何元素在设置UIElement.IsFocusScope或UIElement.Focusable属性
  • 我确保我的代码都没有调用UIElement.CaptureMouse()或UIElement.Focus()。
  • 我将此视图与其他视图进行了比较,以发现一些差异,但我看不到任何突出的地方
  • 我试图确保任何DataTemplate都将TemplateBindings用于Focusable(两种方法均无效)

当我编写这样的导航代码时,我的职责是关于焦点的简短版本吗?经验法则是什么?

例如

  • 是否应该在每列的顶级控件上显式设置Focusable =“ True”?
  • 我应该在某个级别上声明IsFocusScope吗?
  • 当我在某个地方的代码背后手动调用Focus()时 导航到我的观点?
  • 至少,有一种简单的方法可以跟踪焦点的变化而不必为Focus丢失事件编写十几个处理程序吗?

指导将不胜感激。我认为,除非被迫调试,否则我永远不会直截了当地。

如果有关系,这里是一些精简的MainWindow.xaml

<Window x:Class="GelSight.Mobile.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:tk="http://schemas.telerik.com/2008/xaml/presentation"
        prism:ViewModelLocator.AutoWireViewModel="True"
        >
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/> <!-- Navigation/Tools Panel -->
            <ColumnDefinition Width="*"/>    <!-- Page Content Region -->
        </Grid.ColumnDefinitions>


        <ItemsControl Grid.Column="0" 
                      MaxWidth="300" MinWidth="200"  
                      ItemsSource="{Binding AvailablePages, IsAsync=True}"/>

         <ContentControl Grid.Column="1" 
                        x:Name="Page" 
                        prism:RegionManager.RegionName="Main"
                        />
    </Grid>
</Window>

这里是令人讨厌的视图

<UserControl x:Class="MyApp.Configure.Views.SettingsView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:tk="http://schemas.telerik.com/2008/xaml/presentation"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:prism="http://prismlibrary.com/"
             xmlns:viewModels="clr-namespace:MyApp.Configure.ViewModels"
             xmlns:views="clr-namespace:MyApp.Configure.Views"
             prism:ViewModelLocator.AutoWireViewModel="True"
             d:DataContext="{d:DesignInstance viewModels:SettingsVm}"
             d:DesignHeight="500"
             d:DesignWidth="400"
             UseLayoutRounding="true"
             mc:Ignorable="d"
             >

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!--  Order matters here.  Most basic dictionaries first so later ones will get their resources  -->
                <ResourceDictionary Source="/MyApp.Configure;component/Resources/SettingsResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>


            <DataTemplate DataType="{x:Type viewModels:SystemSettingsVm}">
                <views:SystemSettingsView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModels:LibrarySettingsVm}">
                <views:LibrarySettingsView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModels:AnalyzeSettingsVm}">
                <views:AnalyzeSettingsView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModels:ShapeSettingsVm}">
                <views:ShapeSettingsView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModels:CaptureSettingsVm}">
                <views:CaptureSettingsView />
            </DataTemplate>

        </ResourceDictionary>

    </UserControl.Resources>

    <tk:RadTabControl TabStripPlacement="Top" ItemsSource="{Binding Categories} >
        <tk:RadTabControl.Resources>

            <Style TargetType="{x:Type tk:RadTabItem}">  

                <Style.Setters>
                    <Setter Property="Header" Value="{Binding Name}"/>

                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate>
                                <ScrollViewer CanContentScroll="True"
                                              HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
                                              PanningMode="VerticalOnly">
                                    <ContentPresenter Content="{Binding}"/>
                                </ScrollViewer>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>

                </Style.Setters>
            </Style>
        </tk:RadTabControl.Resources>
    </tk:RadTabControl>

</UserControl>

0 个答案:

没有答案