1

プログラムのカスタム コントロールを作成しています。コントロールのテンプレートには、とりわけ ComboBox があります。これが再現するのと同じくらい簡単なもの:

 <Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ComboBox />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

このコントロールを右クリックすると、PreviewMouseRightButtonUp イベントが発生しますが、MouseRightButtonUp イベントは発生しません。これは、ComboBox コントロールが独自の PreviewMouseRightButtonUp イベントで e.Handled を true に設定し、他のイベントが発生しないようにするためだと推測されます。ComboBox の Rectangle を交換すると両方のイベントが発生し、カスタム コントロールで Preview イベントで e.Handled を true に設定すると、プレビュー イベントのみが発生するため、推測しています。

私がコントロールを書いているプログラムは、右クリックが発生したときに両方のイベントが発生することを期待していますが、これを変更できるとは思えません。プレビュー イベントを消費しない方法で ComboBox を再作成する必要がありますか、それとも別のトリックがありますか?

4

1 に答える 1

0

UIElement.Addhandler呼び出しで true を渡す処理済みイベントを実際に受け取ることができます。それが処理された場合、新しいイベントを発生させることができますか?

AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(OnMouseLeftButtonDow), true);

snoopを使用して、どの要素が e.Handled=true; を設定しているかどうかを確認できます。

于 2012-10-03T21:07:44.857 に答える