C#WPF Telerik RadDiagramShape添加关键事件处理程序间歇性故障

C#WPF Telerik RadDiagramShape添加关键事件处理程序间歇性故障,c#,.net,wpf,onkeydown,onkeyup,C#,.net,Wpf,Onkeydown,Onkeyup,我正在添加和删除RadDiagramShape中选定RadDiagramShape的键盘键向下和向上处理程序 我在所选形状上有一个操纵器(Telerik resize/move adorner构造),用于自定义拖动调整大小(我的拖动调整大小元素是拇指) 所需的功能是,按住shift键可以在拖动调整大小期间约束纵横比 这在大多数情况下都有效 我有一个基于所选项目查找所选形状的方法(因为所选形状包含所选项目作为其“内容”)。我已经确认这是返回正确的形状 我还验证了我的Keyboard.AddKeyU

我正在添加和删除RadDiagramShape中选定RadDiagramShape的键盘键向下和向上处理程序

我在所选形状上有一个操纵器(Telerik resize/move adorner构造),用于自定义拖动调整大小(我的拖动调整大小元素是拇指)

所需的功能是,按住shift键可以在拖动调整大小期间约束纵横比

这在大多数情况下都有效

我有一个基于所选项目查找所选形状的方法(因为所选形状包含所选项目作为其“内容”)。我已经确认这是返回正确的形状

我还验证了我的Keyboard.AddKeyUpHandler(selectedShape,OnKeyUp)/Keyboard.AddKeyDownHandler(selectedShape,OnKeyDown)调用总是在需要时执行(即在drag started事件中)

有时,在按下shift键(或任何键,就这一点而言)时,OnKeyDown和onkeydup处理程序根本不会被调用,即使之前刚刚调用了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>
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();
    }
}
我已经解决了这个问题

telerik RadDiagram(至少在本例中)似乎无法决定它或它选择的形状是否有焦点

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


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

欢迎使用SO,user2880413。@Brian谢谢,Brian。
private void OnKeyDown(object sender, KeyEventArgs e)
{
    CheckShiftDepressed();

    if (m_DraggingResizingThumb)
    {
        OnAspectRatioResizingToggled();
    }
}

private void OnKeyUp(object sender, KeyEventArgs e)
{
    CheckShiftDepressed();

    if (m_DraggingResizingThumb)
    {
        OnAspectRatioResizingToggled();
    }
}