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

时间:2017-03-17 11:45:10

标签: c# wpf events mvvm contentcontrol

我有一个View,它在视图中包含两个视图(这些视图包含在ContainerControl中)。 在View的另一侧有一个 Telerik GridView ,用户可以在其中选择一行。选择行时,View的另一侧将动态更改为另一个View(和ViewModel)。动态视图是一个带有大量TextBox的简单Grid,所以没什么特别的。

现在,当用户想要为动态加载的视图输入值时,他必须先点击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;
        }
    }

3 个答案:

答案 0 :(得分:0)

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

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

参考: MSDN Forum

答案 1 :(得分:0)

好吧,这是一个简单的解决方案 - 不是一个漂亮的解决方案:

这只是正确的答案 - 如果您只是希望在加载视图后让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();
    }

正如我所说 - 这是一个解决方法

答案 2 :(得分:0)

我通过删除外部视图(不同的xaml文件)引用并将视图合并到一个大的xaml来解决这个问题。由于某种原因,Telerik的网格视图&#34;偷走&#34;来自引用视图的光标,但是当所有控件都在同一个xaml文件上时,一切都按预期工作。