我的WPF / Prism / .Net Framework应用程序中有一个焦点问题。当我导航到一个特定的视图时,我被迫在按钮或其他控件上单击两次,然后作出响应。
主窗口有两个列。左侧是导航按钮。右侧是显示视图的ContentControl。所有视图都是UserControls。它使用棱镜和区域导航,尽管我怀疑这无关紧要,因为只有一种视图会引起问题。
当我第一次导航到该特定视图(“设置”)时,必须先在其中单击一次,然后才能使用任何控件。仅在其第二次单击时,其任何控件才会响应。
当我单击它的内部后,左上的导航面板也发生了同样的问题。然后,我必须在其中单击两次以使导航按钮开始工作。
其他所有视图都没有出现此问题,尽管它们都使用相同的导航机制。
这是焦点问题,对吗?我已经遍历了我可以在Focus上找到的所有WPF文档(逻辑与键盘,IsFocusScope属性,Focusable属性等),而没有太多的了解。
我也尝试了以下方法
当我编写这样的导航代码时,我的职责是关于焦点的简短版本吗?经验法则是什么?
例如
指导将不胜感激。我认为,除非被迫调试,否则我永远不会直截了当地。
如果有关系,这里是一些精简的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>