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();
    }
}

C# WPF Telerik RadDiagramShape Add Key Event Handlers Interm

我已经解决了这个问题。

Telerik RadDiagram(至少在这种情况下)似乎无法决定它或它选择的形状是否有焦点。

我不确定为什么所选形状可以显示为具有焦点,并且是可拖动的,可移动的等,如果图表具有焦点,则显示其选定的装饰器,而在其他时候,所选形状具有焦点。

添加键上下处理程序后,在所选形状上手动调用 Focus() 为我解决了这个问题。