在方法执行时将焦点设置为文本框

时间:2016-10-24 11:11:03

标签: c# wpf mvvm

我有两个不同的命令;每个人都表演一些行动并透露表格。我希望他们在将Visible属性设置为true时将焦点设置为该表单中的第一个文本框。

我已经看过各种关于这个主题的SO文章,但我似乎无法将这些文章拼凑起来。我正在使用MVVM,但所有MVVM解决方案看起来都非常广泛,仅仅是一个QoL改进。我的代码隐藏文件中有一些代码,所以我假设我可以把它放在那里并且有一个更快/更清洁的解决方案,但是那些我可以找到初学者的重点。

我和Focusmanager搞混了,但这似乎也没把我带到任何地方。

整个建筑的棘手部分如下:

<ListBox Grid.Column="0" Grid.Row="1" Margin="5" IsEnabled="{Binding IsEnabled}" ItemsSource="{Binding DisabledConfigs}" SelectionMode="Extended" SelectedItem="{Binding SelectedConfig}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding SelectionChanged}"/>
        </i:EventTrigger>
        <i:EventTrigger EventName="MouseDoubleClick">
            <cmd:EventToCommand Command="{Binding EditConfig}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</ListBox>

EditConfig -Command触发一个方法,该方法检查双击对象的某些属性,并显示或不显示表单。如果是这样,该表单中的第一个文本框应该获得焦点,否则不会发生任何重要的事情。

我现在整个上午一直在努力解决这个愚蠢的QoL问题,所以我准备把我的左肾捐给任何指向我的方向,我可以干净利用...

修改:在AdminSoftDK提出建议后,我尝试了以下内容

// Auto-generated
private void nameBoxEdit_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
{
    if (nameBoxEdit.IsVisible)
    {
        // nameBoxEdit is (quite self-explanatory) the textbox that I want to focus on
        nameBoxEdit.Focus();
    }
}

我确信这应该与解决方案非常接近,但它不能正常工作。

1 个答案:

答案 0 :(得分:1)

  

对adminSoftDK大力帮助我这里

所以我终于得到了解决方案,这对我来说看起来很奇怪,但是它正在工作所以我不抱怨;

private void nameBoxAdd_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
    {
        if(!nameBoxAdd.IsVisible)
        {
            nameBoxAdd.UpdateLayout();
            // Task.Delay(500); abundant
            nameBoxAdd.Focus(); 
            // After testing some more, the Task.Delay(500) is not needed either. 
            // It's just the combination of UpdateLayout() and Focus()
        }
    }

我在这里有一个非常详尽的方法调用和属性检查列表,看看是否有效,低,并且看到了焦点。我开始过滤,由于某种原因,UpdateLatyout()Focus()上的延迟任务的共同努力使其成功。不是他们(我试过只是一个或另一个让我再次无焦点),但他们两个。

另一个奇怪的事情是,IsVisibleChanged事件会在实际更改属性之前触发。我用调试器跑过的东西..