C# WPF Telerik RadDiagramShape Add Key Event Handlers Interm
本文关键字:Event Handlers Interm Key Add WPF Telerik RadDiagramShape | 更新日期: 2023-09-27 18:35:25
我正在为RadDiagram中选定的RadDiagramShape添加和删除键盘键向下和向上处理程序。
我在所选形状上有一个 ManipulationAdorner(一种 Telerik 调整大小/移动装饰器构造),我使用它来自定义拖动调整大小(我的拖动调整大小元素是拇指)。
所需的功能是按住移位会在拖动调整大小期间限制纵横比。
大多数时候,这都有效。
我有一个基于所选项目查找所选形状的方法(因为所选形状包含所选项目作为其"内容")。我已经验证了这是否返回了正确的形状。
我还验证了我的 Keyboard.AddKeyUpHandler(selectedShape, OnKeyUp)/Keyboard.AddKeyDownHandler(selectedShape, OnKeyDown) 调用总是在需要时执行(即在拖动启动事件中)。
有时,在按 shift 键(或任何键)时,根本不会调用 OnKeyDown 和 OnKeyUp 处理程序,即使之前刚刚调用了添加处理程序调用。
我的问题是,是什么导致了这种行为?
我试图确定焦点是否导致了问题,但我无法证明焦点正在改变。有时,我必须简单地单击所选形状,然后再次单击它,以使移位处理程序正常工作。奇怪的是,在这两种情况下,拖动开始时都会添加事件处理程序。
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);
}
CheckShift郁闷:
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();
}
}
我已经解决了这个问题。
Telerik RadDiagram(至少在这种情况下)似乎无法决定它或它选择的形状是否有焦点。
我不确定为什么所选形状可以显示为具有焦点,并且是可拖动的,可移动的等,如果图表具有焦点,则显示其选定的装饰器,而在其他时候,所选形状具有焦点。
在添加键上下处理程序后,在所选形状上手动调用 Focus() 为我解决了这个问题。