0

こんにちは、自分でネストできるカスタム WF4 アクティビティを使用しています。ダブルクリック イベントをキャッチする必要があるため、OnPreviewMouseDoubleClick メソッドを書き直しました。私の問題は、アクティビティが他のアクティビティの内側にあり、内側のアクティビティにダブルクリックすると、両方でダブルクリックが呼び出されることです。e.Handled = true を設定しましたが、機能しません。親アクティビティでダブルクリック イベントの実行を停止するにはどうすればよいですか。

コードの例を次に示します。

ActivityDesigner1.xaml

<sap:ActivityDesigner x:Class="ActivityDesignerLibrary1.ActivityDesigner1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sap="clr-namespace:System.Activities.Presentation;assembly=System.Activities.Presentation"
    xmlns:sapv="clr-namespace:System.Activities.Presentation.View;assembly=System.Activities.Presentation">
    <Grid>
        <sap:WorkflowItemsPresenter Items="{Binding Path=ModelItem.Activities}">
            <sap:WorkflowItemsPresenter.SpacerTemplate>
                <DataTemplate>
                    <Label HorizontalAlignment="Center" Content="Drop activity here." FontStyle="Italic" Foreground="DarkGray" />
                </DataTemplate>
            </sap:WorkflowItemsPresenter.SpacerTemplate>
        </sap:WorkflowItemsPresenter>
    </Grid>
</sap:ActivityDesigner>

ActivityDesigner1.xaml.cs

using System.Windows;
using System.Windows.Input;

namespace ActivityDesignerLibrary1
{
    public partial class ActivityDesigner1
    {
        public ActivityDesigner1()
        {
            InitializeComponent();
        }

        protected override void OnPreviewMouseDoubleClick(MouseButtonEventArgs e)
        {
            e.Handled = true;
            base.OnPreviewMouseDoubleClick(e);
            MessageBox.Show(this.GetHashCode().ToString());   
        }
    }
}

CodeActivity1.cs

using System;
using System.Activities;
using System.Activities.Statements;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace ActivityDesignerLibrary1
{
    [Designer(typeof(ActivityDesigner1))]
    public sealed class CodeActivity1 : CodeActivity
    {
        private Sequence innerSequence = new Sequence();

        public Collection<Activity> Activities
        {
            get
            {
                return this.innerSequence.Activities;
            }
        }

        protected override void Execute(CodeActivityContext context)
        {
            throw new NotImplementedException();
        }
    }
}
4

3 に答える 3

1

Makus リンクの発言は次のように続きます。

マウスのダブル クリックを処理するコントロールの作成者は、ClickCount が 2 の場合に MouseLeftButtonDown イベントを使用する必要があります。これにより、要素ツリー内の別の要素がイベントを処理する場合に、Handled の状態が適切に伝播されます。

だから私はこの回避策を作成しました:

using System.Windows;
using System.Windows.Input;
using System.Activities.Presentation;
using System.Windows.Media;

namespace ActivityDesignerLibrary1
{
    public partial class ActivityDesigner1
    {
        public ActivityDesigner1()
        {
            InitializeComponent();
        }

        protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
        {
            if (e.ClickCount == 2)
            {
                FrameworkElement fe = e.OriginalSource as FrameworkElement;
                if (fe != null)
                {
                    object original = fe.DataContext;
                    ActivityDesigner baseActivityDesigner = original as ActivityDesigner;
                    if (baseActivityDesigner == null)
                    {
                        baseActivityDesigner = this.ActivityDesignerFinder((DependencyObject)e.OriginalSource);
                    }

                    if (baseActivityDesigner != null)
                    {
                        MessageBox.Show(baseActivityDesigner.GetHashCode().ToString());
                        e.Handled = true;
                    }
                }
            }
        }


        private ActivityDesigner ActivityDesignerFinder(DependencyObject dependencyObject)
        {
            while (dependencyObject != null)
            {
                if (dependencyObject is ActivityDesigner)
                {
                    return (ActivityDesigner)dependencyObject;
                }

                dependencyObject = VisualTreeHelper.GetParent(dependencyObject);
            }

            return null;
        }
    }
}
于 2012-12-17T20:02:40.710 に答える
0

処理されたプロパティに静的ブールを使用してみましたか? ドラッグアンドドロップで同じ問題が発生したことを覚えており、この方法で解決しました。

于 2012-12-17T08:36:13.813 に答える
0

MSDN には答えがあります: リンク

引用: このルーティング イベント ( Control.MouseDoubleClick Event) は、要素ツリーを介してバブリング ルートをたどるように見えますが、実際には、各 UIElement によって要素ツリーに沿って発生する直接ルーティング イベントです。MouseDoubleClick イベント ハンドラーで Handled プロパティを true に設定すると、ルートに沿って後続の MouseDoubleClick イベントが発生し、Handled が false に設定されます。これは、ユーザーがコントロールをダブルクリックしたときに通知を受け取り、アプリケーションでイベントを処理するコントロール コンシューマー向けの上位レベルのイベントです。

于 2012-12-17T08:39:28.540 に答える