如何在单击时将焦点设置到内容控件中的文本框?

问题描述:

我有一个视图,其中包含视图内的两个视图(这些都包含在一个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; 
     } 
    } 
+1

没有足够的数据就无法回答,因为我们不确定您用于动态加载视图的策略。如果可能,你可以制作一个简单的示例应用程序以便更好地理解? – Gopichandar

+0

您在'TextBox'上试过'FocusManager.FocusedElement =“{Binding RelativeSource = {RelativeSource Self}}”吗? – Gopichandar

+0

使用Gopichandar的FocusManager只会使当前的文本框始终处于选中状态,而不是用户点击的文本框。 –

我通过去除外部视图解决了这个(不同XAML文件)基准的工作并将视图合并到一个大的xaml中。出于某种原因,Telerik的gridiview从被引用的视图中“偷走”了光标,但是当所有的控件都在同一个xaml文件中时,所有的东西都按预期工作。

这是有点怪异的行为。焦点应该设置为鼠标点击控制而不是内容控制。我不确定你做错了什么。我尝试了一个示例应用程序,它按预期工作。

This thread说没有好的解决方案。唯一的选择是在控件的模板中将内容控件的IsTabStop属性设置为False,然后添加子部件将绑定到的新属性IsChildTabStop。我不确定它是否会帮助你。

参考:MSDN Forum

奥莱特这里有一个简单的解决方案 - 不是美丽的一个:

这是唯一正确的答案 - 如果你只是想有TextBoxFocus观后被加载。

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(); 
    } 

正如我所说的 - 这是围绕