次の方法で共有


コントロールの「フォーカス」と「FocusVisualStyle」のスタイル設定

Windows Presentation Foundation (WPF) には、キーボード フォーカスを受け取ったときにコントロールの外観を変更するための 2 つの並列メカニズムが用意されています。 最初のメカニズムは、コントロールに適用されるスタイルまたはテンプレート内の IsKeyboardFocused などのプロパティにプロパティ セッターを使用することです。 2 つ目のメカニズムは、 FocusVisualStyle プロパティの値として別のスタイルを提供することです。"フォーカス表示スタイル" では、コントロールまたは他の UI 要素のビジュアル ツリーを置き換えて変更するのではなく、コントロールの上に描画する装飾用の個別のビジュアル ツリーが作成されます。 このトピックでは、これらの各メカニズムが適切なシナリオについて説明します。

フォーカス表示スタイルの目的

フォーカス表示スタイル機能は、UI 要素へのキーボード ナビゲーションに基づいて視覚的なユーザー フィードバックを導入するための一般的な "オブジェクト モデル" を提供します。 これは、コントロールに新しいテンプレートを適用したり、特定のテンプレート構成を知ったりしなくても可能です。

ただし、フォーカス表示スタイル機能はコントロール テンプレートを知らなくても機能するため、フォーカス表示スタイルを使用してコントロールに対して表示できる視覚的フィードバックは、必ずしも制限されます。 この機能が実際に行う機能は、テンプレートを使用してコントロールのレンダリングによって作成された、ビジュアル ツリーの上に別のビジュアル ツリー (装飾) をオーバーレイすることです。 この個別の視覚ツリーは、FocusVisualStyle プロパティが設定されるスタイルを使用して定義します。

既定のフォーカス表示スタイルの動作

フォーカス表示スタイルは、フォーカス アクションがキーボードによって開始された場合にのみ機能します。 マウス操作またはプログラムによるフォーカスの変更によって、フォーカス表示スタイルのモードが無効になります。 フォーカス モードの違いについて詳しくは、「フォーカスの 概要」をご覧ください。

コントロールのテーマには、既定のフォーカス 表示スタイルの動作が含まれます。この動作は、テーマ内のすべてのコントロールのフォーカス 表示スタイルになります。 このテーマ スタイルは、静的キー FocusVisualStyleKeyの値によって識別されます。 アプリケーション レベルで独自のフォーカス 表示スタイルを宣言する場合は、テーマからこの既定のスタイル動作を置き換えます。 または、テーマ全体を定義する場合は、この同じキーを使用して、テーマ全体の既定の動作のスタイルを定義する必要があります。

テーマでは、既定のフォーカス表示スタイルは一般的に非常に単純です。 大まかな近似値を次に示します。

<Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}">
  <Setter Property="Control.Template">
    <Setter.Value>
      <ControlTemplate>
        <Rectangle StrokeThickness="1"
          Stroke="Black"
          StrokeDashArray="1 2"
          SnapsToDevicePixels="true"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

フォーカス表示スタイルを使用する場合

概念的には、コントロールに適用されるフォーカス表示スタイルの外観は、コントロールからコントロールに一貫性がある必要があります。 一貫性を確保する 1 つの方法は、テーマ全体を作成している場合にのみフォーカス表示スタイルを変更することです。テーマで定義されている各コントロールは、まったく同じフォーカス表示スタイル、またはコントロールからコントロールに視覚的に関連するスタイルのバリエーションを取得します。 または、同じスタイル (または同様のスタイル) を使用して、ページまたは UI 上のすべてのキーボードフォーカス可能な要素のスタイルを設定することもできます。

テーマに含まれていない個々のコントロール スタイルに FocusVisualStyle を設定することは、フォーカス表示スタイルを使用するためのものではありません。 これは、コントロール間で一貫性のない視覚的動作が発生すると、キーボード フォーカスに関するユーザー エクスペリエンスが混乱する可能性があるためです。 テーマ間で意図的に一貫性のないキーボード フォーカスに対してコントロール固有の動作を行う場合は、 IsFocusedIsKeyboardFocusedなどの個々の入力状態プロパティのスタイルでトリガーを使用することをお勧めします。

フォーカス表示スタイルは、キーボード フォーカス専用に動作します。 そのため、フォーカス表示スタイルはアクセシビリティ機能の一種です。 マウス、キーボード、またはプログラムを使用した場合に、フォーカスの種類に合った UI の変更が必要な場合は、フォーカス表示スタイルを使用しないでください。代わりに、 IsFocusedIsKeyboardFocusWithinなどの一般的なフォーカス プロパティの値から動作するスタイルやテンプレートでセッターとトリガーを使用する必要があります。

フォーカス表示スタイルを作成する方法

フォーカス表示スタイル用に作成するスタイルには、常にTargetTypeControlが必要です。 スタイルは主に ControlTemplateで構成する必要があります。 ターゲットの種類を、フォーカス表示スタイルが FocusVisualStyleに割り当てられる型に指定しません。

ターゲットの型は常に Controlされるため、すべてのコントロールに共通のプロパティ ( Control クラスとその基底クラスのプロパティを使用) を使用してスタイルを設定する必要があります。 UI 要素へのオーバーレイとして適切に機能し、コントロールの機能領域を隠さないテンプレートを作成する必要があります。 一般に、これは、ビジュアル フィードバックがコントロールの余白の外側に表示されるか、フォーカス表示スタイルが適用されているコントロールに対するヒット テストをブロックしない一時的または目立たない効果として表示されることを意味します。 オーバーレイ テンプレートのサイズ設定と配置を決定するのに役立つテンプレート バインドで使用できるプロパティには、 ActualHeightActualWidthMargin、および Paddingがあります。

フォーカス表示スタイルの使用に代わる方法

フォーカス表示スタイルの使用が適切でない場合 (単一のコントロールのスタイル設定のみであるため、またはコントロール テンプレートをより詳細に制御する必要がある場合) には、フォーカスの変化に応じて視覚的な動作を作成できる他の多くのアクセス可能なプロパティと手法があります。

トリガー、セッター、およびイベント セッターの詳細については、「 スタイル設定とテンプレート」を参照してください。 ルーティング イベントの処理については、 ルーティング イベントの概要に関するページを参照してください。

キーボードがフォーカスされているか (IsKeyboardFocused)

キーボード フォーカスに特に関心がある場合は、プロパティIsKeyboardFocusedTrigger依存関係プロパティを使用できます。 スタイルまたはテンプレートのプロパティ トリガーは、1 つのコントロール専用のキーボード フォーカス動作を定義するためのより適切な手法であり、他のコントロールのキーボード フォーカス動作と視覚的に一致しない可能性があります。

もう 1 つの同様の依存関係プロパティは IsKeyboardFocusWithinです。これは、キーボード フォーカスが合成中またはコントロールの機能領域内にあることを視覚的に呼び出す場合に使用するのに適している可能性があります。 たとえば、キーボード フォーカスがパネル内の個々の要素上にある場合でも、複数のコントロールをグループ化するパネルが異なる方法で表示されるように、 IsKeyboardFocusWithin トリガーを配置できます。

イベントの GotKeyboardFocusLostKeyboardFocus (およびプレビューに相当するもの) を使用することもできます。 これらのイベントは、 EventSetterの基礎として使用することも、分離コードでイベントのハンドラーを記述することもできます。

その他のフォーカス プロパティ

フォーカスの変更によって視覚的な動作が生成される可能性のあるすべての要因を考慮する必要がある場合は、セッターやトリガーをIsFocused依存関係プロパティに基づくか、またはGotFocusに利用されるLostFocusおよびEventSetterイベントに基づかせる必要があります。

こちらも参照ください