web-dev-qa-db-ja.com

スタイルを介してイベント関数を設定する方法は?

いくつかのGUIコントロール要素があり、そのうちのいくつかは、マウス操作(MouseEnter、MouseLeave)で同じアクション(分離コード関数呼び出し)を生成することになっています。
[編集]イベントハンドラでスタイルに関連しない機能を実行しています。
現在、各コントロールでイベント属性を使用しています。

<Button Name="Button" Content="Button 1" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" 
    PreviewMouseDown="Button1_PreviewMouseDown" PreviewMouseUp="Button1_PreviewMouseUp" />
<Button Name="NotInteractingButton" Content="Button 2" 
    /><!-- this button has no MouseOver-effects -->
<ToggleButton Content="ToggleButton" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave"  />
<!-- needs to use IsMouseDirectlyOver on the slider knob... -->
<Slider Name="HorizontalSlider" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" 
    ValueChanged="Slider_ValueChanged" />
<Slider Name="VerticalSlider" Orientation="Vertical" 
    MouseEnter="GeneralMouseEnter" MouseLeave="GeneralMouseLeave" 
    ValueChanged="Slider_ValueChanged" />

この例の多くのコントロールは同じ「GeneralMouseEnter」と「GeneralMouseLeave」という2つの関数を呼び出しているので、その動作をカプセル化するために、スタイルなどを定義できるようにしたいと思います。

[編集-説明]
これは後で一種のプラグインになるはずです。
(任意のGUIプログラムにコードとXAMLファイルを含め、各インタラクティブコントロール要素にスタイルを設定します...)

ウェブで見つけたものから、この例のようにEventTriggersを使用できます。

<Style.Triggers>
  <EventTrigger RoutedEvent="Click">
    <EventTrigger.Actions>
      <BeginAction TargetName="SomeAction" />
    </EventTrigger.Actions>
  </EventTrigger>
</Style.Triggers>

アクション内で関数を呼び出すかどうか、またどのように呼び出すかはわかりません。

  • 各コントロールに適用されるアクション+トリガーを使用してスタイルを作成することにより、この機能を取得することは可能ですか?どうやってするか?
  • 1つのコントロールに(複数のインタラクションイベントの)複数のスタイルを割り当てるにはどうすればよいですか?
  • この動作を実現するためのよりクリーンな方法はありますか?
  • [編集]
    たとえば、GUIのすべてのスライダーでマウス操作をしたい場合はどうしますか?
36
Martin Hennings

マーティン、

eventSetterを使用して、スタイルから直接イベントハンドラーを割り当てることができます。

<Style TargetType="{x:Type Button}">
  <EventSetter Event="Click" Handler="SomeAction"/>
</Style>

@ColinE:

スタイルを使用してイベントワイヤーアップを実行することが良いアイデアかどうかはわかりません。スタイルは、定義により、コントロールの外観を定義します。

残念ながら、これはWPFスタイルに関する一般的で広範な誤解であると思われます。その名前は、あなたが言うように、単に視覚的な外観を定義することを意図したものであることを示唆していますが、実際にははるかに多くの意味があります。プロパティのセットをコントロールに割り当てるためのショートカット。

88
gstercken