0

動作が添付された次の UserControl があります。現時点では、動作を実行するために DataGrid 項目の 1 つを選択する必要があります。

ここで推測するだけですが、これらのコンテナーはフォーカス可能ではないか、キーボード イベントを登録することになっていないため、理解できるので、次の使用可能な子に移動しますか???

この機能をウィンドウに配置することもできますが、この UserControl は別の UserControl と交換される可能性があり、私はそれが横たわっていないことを好みます。これは、ウィンドウ上の唯一のものは DataGrid であり、動作を開始するために必ずしも DataGrid アイテムを選択したくないという私のアプリのユニークなケースです。

私の質問は次のとおりです。次の動作を機能させることは可能ですか? UserControl、Grid、またはこれを許可する他のコントロールのいずれか。

<UserControl x:Class="UserManagement.LaunchPad"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:helpers="clr-namespace:UserManagement.Helpers"
             xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
             xmlns:sys="clr-namespace:System;assembly=mscorlib">

    <i:Interaction.Behaviors>
        <helpers:OpenPopupBehaviors FindPopupObject="{Binding ElementName=PopupFind}" 
                                    GotoPopupObject="{Binding ElementName=PopupGoto}" />
    </i:Interaction.Behaviors>

    <Grid>
        <DockPanel>
            <DataGrid />
        </DockPanel>
        <Popup Name="PopupGoto" />
        <Popup Name="PopupFilter "/>
    </Grid>
</UserControl>

動作は次のとおりです。

class OpenPopupBehaviors : Behavior<UserControl>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.KeyDown += _KeyBoardBehaviorKeyDown;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        this.AssociatedObject.KeyDown -= _KeyBoardBehaviorKeyDown;
    }

    void _KeyBoardBehaviorKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.F && (Keyboard.Modifiers & (ModifierKeys.Control)) == (ModifierKeys.Control))
        {

            var popup = FindPopupObject as UserManagement.Controls.NonTopmostPopup;
            if (popup == null)
                return;

            popup.IsOpen = true;
        }

        if (e.Key == Key.G && (Keyboard.Modifiers & (ModifierKeys.Control)) == (ModifierKeys.Control))
        {
            var popup = GotoPopupObject as Popup;
            if (popup == null)
                return;

            popup.IsOpen = true;
        }
    }

    public static readonly DependencyProperty FindPopupObjectProperty =
        DependencyProperty.RegisterAttached("FindPopupObject", typeof(object), typeof(OpenPopupBehaviors), new UIPropertyMetadata(null));

    public object FindPopupObject
    {
        get { return (object)GetValue(FindPopupObjectProperty); }
        set { SetValue(FindPopupObjectProperty, value); }
    }

    public static readonly DependencyProperty GotoPopupObjectProperty =
        DependencyProperty.RegisterAttached("GotoPopupObject", typeof(object), typeof(OpenPopupBehaviors), new UIPropertyMetadata(null));

    public object GotoPopupObject
    {
        get { return (object)GetValue(GotoPopupObjectProperty); }
        set { SetValue(GotoPopupObjectProperty, value); }
    }
}
4

1 に答える 1

1

これまでのところ、問題の焦点は

フォーカスがコントロールの子またはその子孫にある場合でも、イベントを利用してPreviewイベントを受け取ることができます

protected override void OnAttached()
{
    base.OnAttached();
    this.AssociatedObject.PreviewKeyDown += _KeyBoardBehaviorKeyDown;
}

protected override void OnDetaching()
{
    base.OnDetaching();
    this.AssociatedObject.PreviewKeyDown-= _KeyBoardBehaviorKeyDown;
}

私はに変更KeyDownしましたPreviewKeyDown

AssociatedObject上記の解決策は、それまたはその中の子に焦点を合わせている限り機能します。グローバルに制御することを楽しみにしている場合は、おそらくイベントをトップレベルの要素に添付する必要があるかもしれません.Window

そのためには、適切な親を見つけてAssociatedObject、イベントを同じものにアタッチする必要があります。

また、次のキャストが有効であることを確認してください

FindPopupObject as UserManagement.Controls.NonTopmostPopup;

かもしれない

FindPopupObject as Popup;
于 2014-07-02T09:55:44.263 に答える