我有两个不同的命令;每个人都表演一些行动并透露表格。我希望他们在将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();
}
}
我确信这应该与解决方案非常接近,但它不能正常工作。
答案 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
事件会在实际更改属性之前触发。我用调试器跑过的东西..