Denetimlerde Odak için Stil Oluşturma ve FocusVisualStyle
Windows Presentation Foundation (WPF), klavye odağını aldığında bir denetimin görsel görünümünü değiştirmek için iki paralel mekanizma sağlar. İlk mekanizma, IsKeyboardFocused denetime uygulanan stil veya şablon içindeki gibi özellikler için özellik ayarlayıcıları kullanmaktır. İkinci mekanizma, özelliğinin değeri olarak ayrı bir stil sağlamaktır FocusVisualStyle ; "odak görsel stili", denetimin veya diğer kullanıcı arabirimi öğesinin görsel ağacını 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örsel stili özelliği, herhangi bir kullanıcı arabirimi öğesine yönelik klavye gezintisini temel alan görsel Kullanıcı geri bildirimlerine giriş için ortak bir "nesne modeli" sağlar. Bu, denetime yeni bir şablon uygulamadan veya belirli şablon birleşimini bilmeden mümkündür.
Bununla birlikte, odak görsel stil özelliği denetim şablonlarını bilmeden çalışacağından, odak görsel stili kullanan bir denetim için görüntülenebilen görsel geri bildirimin sınırlı olması gerekir. Özelliğin gerçekten ne yaptığı, bir denetimin işlemesi tarafından şablonu aracılığıyla oluşturulan farklı bir görsel ağacı (bir donatıcı) görsel ağacın üzerine kaplatabileridir. Bu ayrı görsel ağacı, özelliği dolduran bir stil kullanarak tanımlarsınız FocusVisualStyle .
Varsayılan odak görsel stil davranışı
Odak görsel stilleri, yalnızca odak eylemi klavye tarafından başlatıldığında çalışır. Herhangi bir fare eylemi veya programlı odak değişikliği, odak görsel stillerinin modunu devre dışı bırakır. Odak modları arasındaki farklılıklar hakkında daha fazla bilgi için bkz. odağa genel bakış.
Denetimlerin temaları, temadaki tüm denetimler için odak görsel stili haline gelen bir varsayılan odak görsel stil davranışı içerir. Bu tema stili, statik anahtarın değeri tarafından tanımlanır FocusVisualStyleKey . Uygulama düzeyinde kendi odak görsel stilinizi bildirdiğinizde, bu varsayılan stil davranışını temalardan değiştirirsiniz. Alternatif olarak, tüm temayı tanımlarsanız, tüm temanız için varsayılan davranışın stilini tanımlamak üzere bu anahtarı kullanmanız gerekir.
Temalarda, varsayılan odak görsel stili genellikle çok basittir. Aşağıda kabaca bir yaklaşık değer verilmiştir:
<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 stillerinin ne zaman kullanılacağı
Kavramsal olarak, denetimlere uygulanan odak görsel stillerinin görünümü denetimden denetime tutarlı olmalıdır. Tutarlı bir şekilde emin olmanın bir yolu, yalnızca bir temanın tanımlanmış olduğu her bir denetimin çok aynı odak görsel stilini ya da denetim ile denetim için görsel olarak ilişkili bir stilin çeşitlemesini veya bir görünümünü almasını sağlar. Alternatif olarak, bir sayfada veya bir kullanıcı arabirimindeki her klavye odakındaki öğesinde stil eklemek için aynı stili (veya benzer stilleri) kullanabilirsiniz.
FocusVisualStyleBir temanın parçası olmayan bireysel denetim stillerinin ayarlanması, odak görsel stillerinin amaçlanan kullanımı değildir. Bunun nedeni, denetimler arasındaki tutarsız görsel davranışların klavye odağıyla ilgili karmaşık bir kullanıcı deneyimine yol açabilir. Bir temaya uygun olmayan klavye odağı için denetime özgü davranışları kullandıysanız, veya gibi ayrı giriş durumu özelliklerinin stillerinde tetiklemeleri kullanmak çok daha iyi bir yaklaşımdır IsFocusedIsKeyboardFocused .
Odak görsel stilleri, klavye odağı için özel olarak davranır. Bu nedenle, odak görsel stilleri bir erişilebilirlik özelliği türüdür. Her tür odak için fare, klavye veya programlama yoluyla kullanıcı arabirimi değişikliği yapmak istiyorsanız, odak görsel stillerini kullanmamalısınız ve bunun yerine, veya gibi genel odak özelliklerinin değerinden çalışan stillerde veya şablonlarda ayarlayıcılar ve Tetikleyiciler kullanmanız gerekir IsFocusedIsKeyboardFocusWithin .
Odak görsel stili oluşturma
Odak görsel stili için oluşturduğunuz stilin, her zaman öğesine sahip olması gerekir TargetTypeControl . Stil öncelikle bir ile oluşmalıdır ControlTemplate . Hedef türünü, odak görsel stilinin atandığı tür olacak şekilde belirtmeyin FocusVisualStyle .
Hedef türü her zaman olduğu Control için, tüm denetimlerde ortak olan özellikleri kullanarak stil oluşturmanız gerekir ( Control sınıfın ve temel sınıflarının özelliklerini kullanarak). Bir UI öğesine bir kaplama olarak düzgün şekilde çalışacak ve denetimin işlevsel alanını gizlememe bir şablon oluşturmanız gerekir. Genellikle, bu, görsel geri bildirimin denetim kenar boşluklarının dışında görünmesi ya da odak görsel stilinin uygulandığı denetimde isabet sınamasını engellememe geçici ya da unobtrusive etkileri olarak görünmeyeceği anlamına gelir. Şablon bağlamasında kullanabileceğiniz özellikler, yer paylaşımı şablonunuzun boyutlandırma ve yerleşimini belirlemek için faydalıdır,,, ActualHeightActualWidth ve içerir MarginPadding .
Odak görsel stili kullanma alternatifleri
Odak görsel stili kullanmanın, yalnızca tek denetimleri stillendirdiği veya denetim şablonu üzerinde daha fazla denetime sahip olduğu için, odağın içindeki değişikliklere yanıt olarak görsel davranış oluşturabilecek çok sayıda erişilebilir özellik ve teknik olduğu durumlar için uygun değildir.
Tetikleyiciler, ayarlayıcılar ve olay ayarlayıcıları, Stil ve şablonoluşturma bölümünde ayrıntılı olarak ele alınmıştır. Yönlendirilmiş olay işleme, yönlendirilmiş olaylara genel bakışbölümünde ele alınmıştır.
Üzerindeki IsKeyboardFocused
Özellikle klavye odağıyla ilgileniyorsanız, IsKeyboardFocused bağımlılık özelliği bir özellik için kullanılabilir Trigger . Bir stil veya şablondaki bir özellik tetikleyicisi, tek bir denetim için özel olarak bir klavye odağı davranışı tanımlamaya yönelik daha uygun bir tekniktir ve bu, diğer denetimlerin klavye odağı davranışına görsel olarak eşleşmeyebilir.
Benzer bir bağımlılık özelliği IsKeyboardFocusWithin , klavye odağının birleştirme içinde veya denetimin işlevsel alanı içinde bir yerde olmasını görsel olarak çağırmak istiyorsanız, kullanılması uygun olabilecek bir diğer benzerdir. Örneğin, IsKeyboardFocusWithin klavye odağı bu panelin içindeki tek bir öğe üzerinde daha kesin bir şekilde olsa da, birkaç denetimi gruplandıran bir panelin farklı görünmesini sağlayan bir tetikleyici yerleştirebilirsiniz.
Ayrıca, olayları GotKeyboardFocus ve LostKeyboardFocus (Önizleme eşdeğerleriyle birlikte) da kullanabilirsiniz. Bu olayları bir için temel olarak kullanabilir EventSetter veya arka plan kodundaki olaylara yönelik işleyiciler yazabilirsiniz.
Diğer odak özellikleri
Odak değiştirmenin tüm olası nedenlerini görsel bir davranış üretmede kullanmak istiyorsanız, bağımlılık özelliği üzerinde bir ayarlayıcı veya tetikleyiciyi IsFocused ya da GotFocusLostFocus bir için kullanılan olayları ya da ' ı temel almalısınız EventSetter .