WPF,更新ItemsSource后重置键盘焦点

时间:2018-12-03 16:17:02

标签: wpf input

我有一个ListView,并且已订阅 OnListKeyDown()。如果得到左或右输入,则进行一些处理,以有效地重新创建ListView的ItemsSource。 当我说“正在重新创建”时,我的意思是:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let currentText:String = textField.text else {return true}
    if string.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) != nil { return false }
    let newCount:Int = currentText.count + string.count - range.length
    let addingCharacter:Bool = range.length <= 0

    if(newCount == 1){
        textField.text = addingCharacter ? currentText + "(\(string)" : String(currentText.dropLast(2))
        return false
    }else if(newCount == 5){
        textField.text = addingCharacter ? currentText + ") \(string)" : String(currentText.dropLast(2))
        return false
    }else if(newCount == 10){
        textField.text = addingCharacter ? currentText + "-\(string)" : String(currentText.dropLast(2))
        return false
    }

    if(newCount > 14){
        return false
    }

    return true
}

我注意到,此后,如果我向上或向下按下,将重置焦点元素(而不是当前元素,而是第一元素)。我尝试在输入事件期间记录状态,但是一切看起来都正确。

1 个答案:

答案 0 :(得分:0)

战斗几天后,我发现了如何重设键盘焦点。首先,您需要缓存选定的索引,然后在完成更新后,重置选定的项目并集中精力。 这是该代码的摘要:

View.EntriesView.SelectedItem = View.EntriesView.Items[cacheIdx];
View.EntriesView.UpdateLayout();          
((ListViewItem)View.EntriesView.ItemContainerGenerator.ContainerFromIndex(cacheIdx)).Focus();

感谢@Alfie的帮助。