【问题标题】:WPF focus DataGrid during GotFocus event of another control problem另一个控件问题的GotFocus事件期间WPF焦点DataGrid
【发布时间】:2019-10-16 22:24:28
【问题描述】:

根据Event for when KeyboardNavigation.TabNavigation Cycle occurs 的回答,首选解决方案是添加不可见控件作为Detail 焦点范围的最后一个TabIndex,处理此虚拟元素上的GotFocus()。作为处理此“事件”的一部分,我想将焦点移回主网格MasterDG.Focus()

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="2*"/>
        <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>
    <DataGrid Name="MasterDG" ItemsSource="{Binding Items}" FocusManager.IsFocusScope="True"/>
    <StackPanel Name="Detail" Grid.Row="1"  FocusManager.IsFocusScope="True">
        <TextBox/>
        <TextBox/>
        <TextBox/>
        <Control Name="DummyControl" 
                 GotFocus="DummyControl_GotFocus"/>
    </StackPanel>
</Grid>

事件处理程序

private void DummyControl_GotFocus(object sender, RoutedEventArgs e)
{
    Save(); //save when done editing last element of detail
    MasterDG.Focus();
}

但是,这不仅会导致 MasterDG 被聚焦,还会在当前单元格上进入编辑模式,并且 插入 \t 字符会覆盖任何单元格内容。我该如何解决这个问题?
注意 Detail 的实际内容是动态生成的。

【问题讨论】:

    标签: c# wpf events focus


    【解决方案1】:

    一个简单的解决方法是在下一个调度程序周期调用Focus()

    private void DummyControl_GotFocus(object sender, RoutedEventArgs e)
    {
        Save(); //save when done editing last element of detail
        Dispatcher.BeginInvoke(new Action(() => MasterDG.Focus()));
    }
    

    【讨论】:

    • 好主意 - 因为它是 GUI,我可能会侥幸逃脱。仍在弄清楚它是否可以适应 MVVM + IsFocused 附加属性。可能不会。
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2013-06-12
    • 2012-12-13
    相关资源
    最近更新 更多