0

KeyTriggerコントロール内で使用すると が起動しないことに気付きましたPopup

<UserControl x:Class="SilverlightBindingTest.iTest"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         mc:Ignorable="d"
         d:DesignHeight="300" d:DesignWidth="400"
         xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
         xmlns:ii="clr-namespace:Microsoft.Expression.Interactivity.Input;assembly=Microsoft.Expression.Interactions"
         xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions">

    <Grid x:Name="LayoutRoot" Background="White">
        <Popup IsOpen="True">
            <i:Interaction.Triggers>
                <ii:KeyTrigger Key="Enter">
                    <ei:ChangePropertyAction TargetName="alert" PropertyName="Visibility" Value="Visible" />
                </ii:KeyTrigger>
            </i:Interaction.Triggers>

            <StackPanel>
                <TextBox />
                <TextBlock Text="hi" x:Name="alert" Visibility="Collapsed"/>
            </StackPanel>
        </Popup>
    </Grid>
</UserControl>

ポップアップ部分を削除すると、これは期待どおりに機能します (Enter キーを押すと「hi」が表示されます)。

何が起きてる?KeyTrigger が失敗する理由が思いつきません。

4

1 に答える 1

0

何が起きてる?

コードKeyTriggerがアプリケーション ルートにリスナーを追加する可能性があります。その場合、Popup コントロールからバブルアップすることはありません (ビジュアル ツリーにないため)。ええと、問題ありません。私はソースをチェックします...ああ、待ってください、ソースは秘密で独占的です。ありがとうマイクロソフト!

とにかく、これはリスナーをTriggerBase.AssociatedObjectにアタッチするキートリガーで、ポップアップ内で機能します。

public class KeyTriggerThatWorks : TriggerBase<FrameworkElement>
{
    private FrameworkElement _target;

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Loaded += (sender, args) =>
        {
            _target = AssociatedObject;
            _target.KeyDown += new KeyEventHandler(Visual_KeyDown);
        };  
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        _target.KeyDown -= new KeyEventHandler(Visual_KeyDown);   
    }

    public Key Key { get; set; }

    void Visual_KeyDown(object sender, KeyEventArgs args)
    {
        if (Key == args.Key)
            InvokeActions(Key);
    }  
}

また、これを Popup 自体ではなく、Popup の子にアタッチする必要があります。Microsoftの秘密の独自コードを知っている人だけが知っている理由により、KeyDownにアタッチされている場合、ハンドラーは起動しません。Popup

<Popup IsOpen="True">
    <StackPanel>

        <i:Interaction.Triggers>
            <local:KeyTriggerThatWorks Key="Enter">
                <ei:ChangePropertyAction TargetName="alert" PropertyName="Visibility" Value="Visible" />
            </local:KeyTriggerThatWorks>
        </i:Interaction.Triggers>

        <TextBox />
        <TextBlock Text="hi" x:Name="alert" Visibility="Collapsed"/>
    </StackPanel>
</Popup>
于 2013-11-06T20:31:30.890 に答える