Denetimlerde Odak için Stil Oluşturma ve FocusVisualStyle

Windows Presentation Foundation (WPF), klavye odağı aldığında denetimin görsel görünümünü değiştirmek için iki paralel mekanizma sağlar. İlk mekanizma, denetime uygulanan stil veya şablon gibi IsKeyboardFocused özellikler için özellik ayarlayıcıları kullanmaktır. İkinci mekanizma, özelliğin FocusVisualStyle değeri olarak ayrı bir stil sağlamaktır; "odak görseli stili", denetimin görsel ağacını veya diğer ui öğesini değiştirerek değiştirmek yerine denetimin üzerine çizen bir donatıcı için ayrı bir görsel ağaç oluşturur. Bu konuda, bu mekanizmaların her birinin uygun olduğu senaryolar ele alınmaktadır.

Odak Görsel Stilinin Amacı

Odak görseli stili özelliği, herhangi bir kullanıcı arabirimi öğesine klavye gezintisini temel alan görsel kullanıcı geri bildirimlerini tanıtmak için ortak bir "nesne modeli" sağlar. Bu, denetime yeni bir şablon uygulamadan veya belirli bir şablon bileşimini bilmeden mümkündür.

Ancak, odak görseli stili özelliği denetim şablonlarını bilmeden çalıştığından, odak görseli stili kullanılarak bir denetim için görüntülenebilen görsel geri bildirim mutlaka sınırlıdır. Özelliğin aslında yaptığı şey, bir denetimin şablonu aracılığıyla işlemesi tarafından oluşturulan görsel ağacının üzerine farklı bir görsel ağacı (bir donatıcı) kaplamaktır. Özelliği dolduran FocusVisualStyle bir stil kullanarak bu ayrı görsel ağacı tanımlarsınız.

Varsayılan Odak Görseli Stil Davranışı

Odak görseli stilleri yalnızca odak eylemi klavye tarafından başlatıldığında uygulanır. Herhangi bir fare eylemi veya programlı odak değişikliği, odak görseli stillerinin modunu devre dışı bırakır. Odak modları arasındaki farklar hakkında daha fazla bilgi için bkz . Odaklanmaya Genel Bakış.

Denetimler için temalar, temadaki tüm denetimler için odak görseli stiline dönüşen varsayılan bir odak görseli stili davranışı içerir. Bu tema stili, statik anahtarının FocusVisualStyleKeydeğeriyle tanımlanır. Uygulama düzeyinde kendi odak görseli stilinizi bildirdiğinizde, temalardan bu varsayılan stil davranışını değiştirirsiniz. Alternatif olarak, temanın tamamını tanımlarsanız, temanızın tamamı için varsayılan davranışın stilini tanımlamak için aynı anahtarı kullanmanız gerekir.

Temalarda varsayılan odak görseli stili genellikle çok basittir. Aşağıdakiler kaba bir yaklaşık değerdir:

<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>

Odak Görsel Stilleri Ne Zaman Kullanılır?

Kavramsal olarak, denetimlere uygulanan odak görseli stillerinin görünümü denetimden denetime tutarlı olmalıdır. Tutarlılığı sağlamanın bir yolu, odak görseli stilini yalnızca temanın tamamını oluşturuyorsanız değiştirmektir; burada temada tanımlanan her denetim aynı odak görsel stilini veya denetimden denetime kadar görsel olarak ilişkili bir stilin çeşitlemesini alır. Alternatif olarak, sayfadaki veya kullanıcı arabirimindeki klavye odaklı her öğeye stil eklemek için aynı stili (veya benzer stilleri) kullanabilirsiniz.

Temanın parçası olmayan tek tek denetim stillerini ayarlamak FocusVisualStyle , odak görseli stillerinin amaçlanan kullanımı değildir. Bunun nedeni, denetimler arasındaki tutarsız bir görsel davranışın klavye odağıyla ilgili kafa karıştırıcı bir kullanıcı deneyimine yol açabilmesidir. Klavye odağı için bir tema arasında özellikle uyumlu olmayan denetime özgü davranışlar kullanmayı planlıyorsanız, veya IsKeyboardFocusedgibi IsFocused tek tek giriş durumu özellikleri için stillerde tetikleyicileri kullanmak çok daha iyi bir yaklaşımdır.

Odak görseli stilleri yalnızca klavye odağı için hareket eder. Bu nedenle, odak görseli stilleri bir erişilebilirlik özelliği türüdür. Fare, klavye veya program aracılığıyla herhangi bir odak türü için kullanıcı arabirimi değişiklikleri yapmak istiyorsanız, odak görseli stillerini kullanmamalı ve bunun yerine veya IsKeyboardFocusWithingibi IsFocused genel odak özelliklerinin değerinden çalışan stillerde veya şablonlarda ayarlayıcıları ve tetikleyicileri kullanmalısınız.

Odak Görseli Stili Oluşturma

Odak görseli stili için oluşturduğunuz stilde her zaman öğesinin TargetTypeContrololması gerekir. Stil esas olarak bir ControlTemplate'den oluşmalıdır. Hedef türü, odak görseli stilinin öğesine atandığı FocusVisualStyletür olarak belirtmezsiniz.

Hedef türü her zaman Contrololduğundan, tüm denetimler için ortak olan özellikleri (sınıfın ve temel sınıflarının Control özelliklerini kullanarak) kullanarak stil oluşturmanız gerekir. Bir kullanıcı arabirimi öğesinde yer paylaşımı olarak düzgün çalışacak ve denetimin işlevsel alanlarını gizlemeyecek bir şablon oluşturmanız gerekir. Genel olarak bu, görsel geri bildirimin denetim kenar boşluklarının dışında veya odak görsel stilinin uygulandığı denetimde isabet testini engellemeyecek geçici veya göze çarpmayan efektler olarak görünmesi gerektiği anlamına gelir. Şablon bağlamasında kullanabileceğiniz ve katman şablonunuzun boyutlandırmasını ve konumlandırmasını belirlemek için yararlı olan özellikler arasında ActualHeight, ActualWidth, Marginve Paddingbulunur.

Odak Görseli Stili Kullanmanın Alternatifleri

Odak görseli stilini kullanmanın uygun olmadığı durumlarda, yalnızca tek denetimleri şekillendirdiğiniz veya denetim şablonu üzerinde daha fazla denetim sahibi olmak istediğiniz için, odaktaki değişikliklere yanıt olarak görsel davranış oluşturabilecek başka birçok erişilebilir özellik ve teknik vardır.

Tetikleyiciler, ayarlayıcılar ve olay ayarlayıcılarının tümü Stil oluşturma ve Şablon Oluşturma konusunda ayrıntılı olarak ele alınıyor. Yönlendirilen olay işleme, Yönlendirilen Olaylara Genel Bakış bölümünde açıklanmıştır.

Iskeyboardfocused

Özellikle klavye odağıyla ilgileniyorsanız, IsKeyboardFocused bağımlılık özelliği özelliği Triggeriçin kullanılabilir. Stil veya şablonda özellik tetikleyicisi, özellikle tek bir denetime yönelik olan ve diğer denetimler için klavye odağı davranışıyla görsel olarak eşleşmeyebilen bir klavye odağı davranışı tanımlamak için daha uygun bir tekniktir.

Benzer bir bağımlılık özelliği de, IsKeyboardFocusWithinklavye odağının birleştirme içinde veya denetimin işlevsel alanında bir yerde olduğunu görsel olarak çağırmak istiyorsanız kullanmak uygun olabilecek özelliğidir. Örneğin, klavye odağı söz konusu paneldeki tek bir öğede daha hassas olsa bile, birkaç denetimi gruplandıran bir panelin farklı görünmesini sağlayan bir tetikleyici yerleştirebilirsiniz IsKeyboardFocusWithin .

Ve olaylarını GotKeyboardFocusLostKeyboardFocus (önizleme eşdeğerlerinin yanı sıra) da kullanabilirsiniz. Bu olayları bir EventSetteriçin temel olarak kullanabilir veya arka planda kod biçimindeki olaylar için işleyiciler yazabilirsiniz.

Diğer Odak Özellikleri

Odağı değiştirmenin tüm olası nedenlerinin görsel bir davranış oluşturmasını istiyorsanız, bir ayarlayıcıyı veya tetikleyiciyi IsFocused bağımlılık özelliğine veya alternatif olarak için EventSetterkullanılan veya LostFocus olaylarına dayandırmalısınızGotFocus.

Ayrıca bkz.