Silverlight的双击触发

McG*_*gle 4 c# silverlight xaml blend-sdk

相关: “在Silverlight中最干净的单击+双击处理?”


使双击触发XAML中的某些操作的最简单方法是什么?

我正在尝试做这样的事情,当用户双击ListBox项时关闭弹出窗口:

<Popup x:Name="popup">
    <ListBox ItemsSource="{Binding Colors}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Rectangle Color="{Binding Color}">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="DoubleClick">
                            <ei:ChangePropertyAction TargetObject="{Binding ElementName=popup}"
                                                     PropertyName="IsOpen" Value="False" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </Rectangle>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ListBox>
</Popup>
Run Code Online (Sandbox Code Playgroud)

上面的问题当然是没有“ DoubleClick”事件。因此,我需要将其替换为EventTrigger双击触发器。

McG*_*gle 6

通过继承TriggerBase<T>侦听器并将其附加到“ MouseLeftButtonDown”事件来创建自定义双击触发器。检查“ MouseButtonEventArgs.ClickCount”属性以检查是否双击:

public class DoubleClickTrigger : TriggerBase<FrameworkElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.AddHandler(FrameworkElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(OnClick), true);
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.RemoveHandler(FrameworkElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler(OnClick));
    }

    private void OnClick(object sender, MouseButtonEventArgs args)
    {
        if (args.ClickCount == 1)
            return;
        if (args.ClickCount == 2)
            InvokeActions(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,OP中的XAML应该通过将EventTrigger替换为上述内容而起作用DoubleClickTrigger