【问题标题】:Get and Setfocus of an element获取和设置元素的焦点
【发布时间】:2011-09-27 17:43:24
【问题描述】:

我要做的是在刷新我的 BO 之前获取最后一个焦点元素并将其设置回最后一个焦点值。

这个想法是这样的:

//get last focus element
var x = Keyboard.FocusedElement;
//refresh my businessobject here
CallMethod();
//set the focus to my last element
FocusManager.SetFocusedElement(focusScope, x);

...但这里的问题是在调用刷新对象方法后,我的“x”值在此过程中发生了变化。

有人遇到过这个问题吗?

【问题讨论】:

  • 问题是“x”值在调用方法之后发生了变化。尽管我只设置了一次。这就像获取focusScope的第一个元素的值一样。
  • 我的目标是保存“x”的值,因此在业务对象中进行刷新后,我可以将焦点设置回刷新前的最后一个焦点控件。

标签: c# wpf focus


【解决方案1】:

您不能只分配Keyboard.FocusedElement,因为Keyboard.FocusedElement 是一个引用类型。因此,一旦框架更改了Keyboard.FocusedElement,您的副本就会更改。您将需要找到一种新方法来识别调用之前具有焦点的控件,或者尝试找到有效的深层复制解决方案。

【讨论】:

  • 这就是我想发生的事情。您对如何实现深拷贝还有其他想法吗?谢谢!
  • 不幸的是,在 .NET 中进行深度复制并不容易。特别是如果它涉及一个包含许多引用和嵌套对象的对象。我见过使用序列化和反序列化的解决方案,一些使用反射,另一些对对象内的所有引用类型使用复制构造函数。
  • 我不建议在这里使用深拷贝。我会尝试其他替代方法,例如不记得对象,但可能记得控件的名称或类似的东西。
  • 其实,我会后退一点...我做了一个简单的 WPF 程序,它有 4 个文本框和 1 个按钮。所以在我后面的代码和 text2_textchanged 事件中,我将 Keyboard.FocusedElement 分配给我的变量 x 和我的 button_click - 我有另一个 Keyboard.FocusedElement 调用分配给 y 然后做了一个 x.Focus() 它记住了 x 的原始值它有效......所以我不认为它是引用类型。
【解决方案2】:

为什么不使用Focus() 方法??

//get focused element
UIElement x = Keyboard.FocusedElement as UIElement;

//refresh my businessobject here
CallMethod();

//set the focus to my last element
x.Focus();

或考虑使用FocusManager.GetFocusedElement(focusScope)...

【讨论】:

  • 在我的 CallMethod() 中,有一个函数,每当我刷新 BO 时,它将始终设置为第一个元素。因此,如果我执行 x.Focus() ,则“x”不再包含我的最后一个焦点元素。乔希,把它打在参考类型的球上。我只会做一个深拷贝的扩展方法来克服这个问题——但如果有人有更好的主意,请告诉我。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2018-10-05
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 2012-04-17
相关资源
最近更新 更多