我正在为 RadDiagram 中的选定 RadDiagramShape 添加和删除键盘按键向下和向上处理程序。
我在选定的形状上有一个 ManipulationAdorner(Telerik 调整大小/移动装饰器构造),用于自定义拖动调整大小(我的拖动调整大小元素是拇指)。
所需的功能是在拖动调整大小期间按住 shift 会限制纵横比。
这在大多数情况下都有效。
我有一种方法可以根据所选项目查找所选形状(因为所选形状包含所选项目作为其“内容”)。我已经验证这是返回正确的形状。
我还验证了我的 Keyboard.AddKeyUpHandler(selectedShape, OnKeyUp) / Keyboard.AddKeyDownHandler(selectedShape, OnKeyDown) 调用总是在需要时执行(即在拖动开始事件中)。
有时,在按下 shift 键(或任何键,就此而言)时,根本不会调用 OnKeyDown 和 OnKeyUp 处理程序,即使之前刚刚调用了 add 处理程序调用。
我的问题是,什么可能导致这种行为?
我试图确定焦点是否导致了问题,但我无法证明焦点正在改变。有时,我必须简单地单击选定的形状,然后再次单击它,才能使轮班处理程序正常工作。奇怪的是,在这两种情况下,事件处理程序都是在拖动开始时添加的。
CheckShiftDepressed() 是一个手动调用,用于检查在拖动调整大小开始之前是否按下了 shift 键。我在拖动调整大小期间检测到 shift 键更改的唯一原因是在按下和释放 shift 时立即重塑拖动的选定形状(根据纵横比,或者释放时的光标位置)。
提前致谢,
瑞安
下面的相关代码和 XAML:
调整大小拇指:
<Style x:Key="ResizingThumbStyle" TargetType="{x:Type Thumb}">
...
<EventSetter Event="DragStarted" Handler="ResizingThumb_DragStarted" />
<EventSetter Event="DragDelta" Handler="ResizingThumb_DragDelta" />
<EventSetter Event="DragCompleted" Handler="ResizingThumb_DragCompleted" />
</Style>
拖动调整大小开始:
private void ResizingThumb_DragStarted(object sender, DragStartedEventArgs e)
{
// Get the dragged shape starting aspect ratio.
if (u_rd_Diagram.SelectedItem != null)
{
...
CheckShiftDepressed();
SetSelectedShapeShiftKeyListening(true);
}
CheckShiftDepressed:
private void CheckShiftDepressed()
{
m_ShiftDepressed = (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)) ? true : false;
}
拖动调整大小完成:
private void ResizingThumb_DragCompleted(object sender, DragCompletedEventArgs e)
{
...
CheckShiftDepressed();
SetSelectedShapeShiftKeyListening(false);
}
在选定的形状上设置关键监听事件:
private void SetSelectedShapeShiftKeyListening(bool ListenForShiftKeyChanges)
{
RadDiagramShape selectedShape = null;
if (GetSelectedShape(out selectedShape))
{
if (ListenForShiftKeyChanges)
{
Keyboard.AddKeyUpHandler(selectedShape, OnKeyUp);
Keyboard.AddKeyDownHandler(selectedShape, OnKeyDown);
}
else
{
Keyboard.RemoveKeyUpHandler(selectedShape, OnKeyUp);
Keyboard.RemoveKeyDownHandler(selectedShape, OnKeyDown);
}
}
}
对于任何人的兴趣, OnKeyUp 和 OnKeyDown 处理程序方法:
private void OnKeyDown(object sender, KeyEventArgs e)
{
CheckShiftDepressed();
if (m_DraggingResizingThumb)
{
OnAspectRatioResizingToggled();
}
}
private void OnKeyUp(object sender, KeyEventArgs e)
{
CheckShiftDepressed();
if (m_DraggingResizingThumb)
{
OnAspectRatioResizingToggled();
}
}