如何在单击时将焦点设置到内容控件中的文本框?
我有一个视图,其中包含视图内的两个视图(这些都包含在一个ContainerControl中)。 在视图的另一侧,有一个Telerik GridView用户可以在其中选择一行。当选择一行时,视图的另一侧将动态更改为另一个视图(和ViewModel)。动态视图是一个带有大量文本框的简单网格,因此没有什么特别的。如何在单击时将焦点设置到内容控件中的文本框?
现在,当用户想要为动态加载的视图输入值时,他必须先点击ContentControl
,然后再次点击他想要关注的TextBox
。这只发生在GridView的行在编辑模式。
我试过设置ContentControl的FocusManager.IsFocusScope="False"
。
我也试过设置所有其他控件与IsFocusable=False
。
我知道必须有办法用WPF事件做到这一点,但我不是这方面的专家。
我设置使用Catel的转换器这样的动态视图(不知道这是有关):
XAML:
<ContentControl Content="{Binding SelectedItemViewModel, Mode=TwoWay, Converter={catel:ViewModelToViewConverter}}" />
视图模型:
public MyDataModel SelectedItem
{
get { return GetValue<MyDataModel>(SelectedItemProperty); }
set
{
SetValue(SelectedItemProperty, value);
RaisePropertyChanged(() => SelectedItemViewModel);
}
}
public static readonly PropertyData SelectedItemProperty = RegisterProperty("SelectedItem", typeof(MyDataModel));
public ViewModelBase SelectedItemViewModel
{
get
{
if (SelectedItem != null)
{
switch (SelectedItem.Type)
{
case 1:
return new OneViewModel(SelectedItem);
case 2:
return new TwoViewModel(SelectedItem);
}
}
return null;
}
}
我通过去除外部视图解决了这个(不同XAML文件)基准的工作并将视图合并到一个大的xaml中。出于某种原因,Telerik的gridiview从被引用的视图中“偷走”了光标,但是当所有的控件都在同一个xaml文件中时,所有的东西都按预期工作。
这是有点怪异的行为。焦点应该设置为鼠标点击控制而不是内容控制。我不确定你做错了什么。我尝试了一个示例应用程序,它按预期工作。
This thread说没有好的解决方案。唯一的选择是在控件的模板中将内容控件的IsTabStop
属性设置为False
,然后添加子部件将绑定到的新属性IsChildTabStop
。我不确定它是否会帮助你。
参考:MSDN Forum
奥莱特这里有一个简单的解决方案 - 不是美丽的一个:
这是唯一正确的答案 - 如果你只是想有TextBox
有Focus
观后被加载。
XAML
<UserControl x:Class="WpfApplication4.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApplication4"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBox Loaded="TextBox_Loaded"/>
</Grid>
</UserControl>
代码隐藏
private void TextBox_Loaded(object sender, RoutedEventArgs e)
{
TextBox self = sender as TextBox;
if (self != null)
self.Focus();
}
正如我所说的 - 这是围绕
没有足够的数据就无法回答,因为我们不确定您用于动态加载视图的策略。如果可能,你可以制作一个简单的示例应用程序以便更好地理解? – Gopichandar
您在'TextBox'上试过'FocusManager.FocusedElement =“{Binding RelativeSource = {RelativeSource Self}}”吗? – Gopichandar
使用Gopichandar的FocusManager只会使当前的文本框始终处于选中状态,而不是用户点击的文本框。 –