Проблема с фокусом WPF: необходимо щелкнуть два раза в одном представлении после навигации - PullRequest
0 голосов
/ 02 мая 2019

У меня проблема с фокусом в моем приложении WPF / Prism / .Net Framework. Когда я перехожу к одному конкретному представлению, я вынужден дважды щелкнуть по кнопке или другому элементу управления, прежде чем он откликнется.

Главное окно имеет две колонки. Слева находятся кнопки навигации. Справа находится ContentControl, показывающий вид. Все представления являются пользовательскими элементами управления. Он использует призму и навигацию по регионам, хотя я подозреваю, что это не актуально, поскольку только одно представление вызывает проблемы.

enter image description here

  1. Когда я впервые перехожу к этому конкретному представлению («Настройки»), я должен один раз щелкнуть внутри него, чтобы сработал какой-либо из элементов управления. Только на второй щелчок внутри него реагирует любой из его элементов управления.

  2. После того, как я щелкну внутри него, та же проблема случится с моей панелью навигации на слева . Затем я должен сделать два щелчка там, чтобы кнопки навигации начали работать.

  3. Ни один из других видов не демонстрирует эту проблему, хотя все они используют один и тот же механизм навигации.

Это вопрос фокуса, верно? Я просмотрел все документы WPF, которые я могу найти в Focus (логика против клавиатуры, свойство IsFocusScope, свойство Focusable и т. Д.) Без особого понимания.

Я также попробовал следующее

  • Я убедился, что никакие элементы в визуальном дереве не устанавливают ни свойства UIElement.IsFocusScope, ни UIElement.Focusable
  • Я убедился, что ни один из моего кода не вызывает UIElement.CaptureMouse () или UIElement.Focus ().
  • Я сравнил эту точку зрения со всеми другими, чтобы заметить некоторые различия. Но я не вижу ничего, что выделялось
  • Я пытался убедиться, что любые шаблоны данных используют TemplateBindings для Focusable (безрезультатно в любом случае)

Есть ли краткая версия моих обязанностей относительно фокуса, когда я пишу свой код навигации, как этот? Каковы правила большого пальца?

Например,

  • Должен ли я явно указывать Focusable = "True" для элемента управления верхнего уровня в каждом столбце?
  • Должен ли я объявить IsFocusScope на каком-то уровне?
  • Должен ли я когда-нибудь вручную вызывать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...