我在WPF中有一些奇怪的ListView控件行为.
我们正在用C#开发应用程序.
我用一些项创建了ListView,并将SelectedIndex设置为列表中间的某个索引.然后我在ListView上的任何位置单击鼠标,然后使用Up/Dows键盘键导航,一切正常.但是,如果我将焦点移动到另一个控件,然后尝试以编程方式将焦点设置回ListView控件,那么我就会遇到问题.
ListView获得焦点,但是当我尝试使用键盘导航时,将取消当前选择并选择第一个项目,导航将从列表中的第一个项目开始.
我通过调用它的.Focus()方法将焦点设置到ListView控件.
它看起来甚至是ListView控件的焦点,但实际上没有项目在焦点上,即使SelectedIndex有一些有效值.
请帮我!如何以编程方式将焦点设置为ListView控件以防止此类行为?
我发现我的listview选择索引与焦点项目不同.谁 ???
在selectedindex_changed事件中,我将所选索引设置为修复项目(5),但是当我按箭头键时,项目已更改.这意味着所选索引固定为5,但当前项目(以其周围的点边框显示)移动到箭头键位置.无论如何,我的选择项固定为5,但我的滚动视图移动到当前项目的位置.
此代码在listView1_SelectionChanged中:listView1.SelectionMode = SelectionMode.Single; listView1.SelectedIndex = 5;
我的listview有一个修改过的视图:
<l:PlainView x:Key="tileView"
ItemTemplate="{StaticResource centralTile}"
ItemHeight="120" ItemWidth="130" />
Run Code Online (Sandbox Code Playgroud)
我不再知道问题了解.
问候
我希望在PreviewTextInput处理程序中创建一个新控件并将焦点设置为它.但即使在新控件上调用Focus()之后,光标仍然在旧文本框中.处理程序UserControl_PreviewTextInput在UserControl上注册,如果这很重要,则包含此文本框.
private void UserControl_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
CodeLineControl el = new CodeLineControl();
container.Children.Insert(idx+1, el);
el.innerTextBox.Focus();
}
Run Code Online (Sandbox Code Playgroud)
CodeLineControl定义如下(简化):
<UserControl ..>
<DockPanel Name="codeline" Background="AntiqueWhite" >
<TextBox Name="innerTextBox"/>
</DockPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
Focus()是否存在一些限制?我不允许将Focus()从PreviewTextInput处理程序中移出TextBox吗?我不能把注意力集中在新创建的元素上吗?
好吧,这必须是一个重复的问题,但我找不到答案:我有一个数据集到数据集的列表框.默认情况下,选择项目[0].我如何防止这种情况,以确保在我单击ListBoxItem时提出SelectionChanged事件?
编辑:我已经解除了SelectedIndex = -1路由,但我再次尝试:在Listbox的构造函数中将SelectedIndex设置为-1(或作为XAML中的属性)不起作用.似乎在初始化之后填充了列表框,并且selectedIndex将在all.Same故事之后变为0,用于将SelectedItem设置为null;
我试过这个:
<ListBox ItemsSource="{Binding Value}"
SelectionChanged="ListBox_SelectionChanged"
IsSynchronizedWithCurrentItem="True"
Loaded="ListBox_Loaded">
</ListBox>
Run Code Online (Sandbox Code Playgroud)
有:
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(e.AddedItems.Count==0)return;//Prevents stackoverflow! ;-)
((ListBox)e.OriginalSource).SelectedItem=null;
}
private void ListBox_Loaded(object sender, RoutedEventArgs e)
{
((ListBox) sender).SelectedItem = null;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但它在列表框显示的项目顶部插入一个空行,这非常难看....在我的特定情况下,我可以通过删除IsSynchronizedWithCurrentItem属性来解决问题.
但我可以想到许多情况,这是不可接受的.
上面的语句是无意义的:要么您想要使用主 - 细节绑定并将IsSynchronizedWithCurrentItem设置为true,要么您不想.您不太可能希望使用主 - 详细信息绑定,然后始终在列表框中没有当前选定的项目