1

我正在为 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();
    }
}
4

1 回答 1

0

我已经解决了这个问题。

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

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

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

于 2013-10-15T13:16:45.403 回答