Girişe Genel Bakış
Windows Presentation Foundation (WPF) alt sistemi, fare, klavye, dokunma ve ekran kalemi gibi çeşitli cihazlardan giriş almak için güçlü bir API sağlar. Bu konu başlığı altında WPF tarafından sağlanan hizmetler açıklanır ve giriş sistemlerinin mimarisi açıklanır.
Giriş API'si
Birincil giriş API'sine maruz kalma, temel öğe sınıflarında bulunur: UIElement, ContentElement, FrameworkElementve FrameworkContentElement. Temel öğeler hakkında daha fazla bilgi için bkz. Temel Öğelere Genel Bakış. Bu sınıflar tuş basmaları, fare düğmeleri, fare tekerleği, fare hareketi, odak yönetimi ve fare yakalama ile ilgili giriş olayları için birkaç işlev sağlar. Giriş mimarisi, giriş API'sini tüm giriş olaylarını hizmet olarak işlemek yerine temel öğelere yerleştirerek, giriş olaylarının kullanıcı arabirimindeki belirli bir nesne tarafından kaynaklanması ve birden fazla öğenin giriş olayını işleme fırsatına sahip olduğu bir olay yönlendirme düzenini desteklemesini sağlar. Birçok giriş olayına, onlarla ilişkilendirilen bir olay çifti eşlik eder. Örneğin, tuşa basma olayı KeyDown ve PreviewKeyDown olaylarıyla ilişkilendirilir. Bu olaylardaki fark, hedef öğeye nasıl yönlendirildiklerindedir. Önizleme olayları, kök öğeden hedef öğeye öğe ağacının aşağısına tünel oluşturur. Olaylar, hedef öğeden kök öğeye doğru yükselir. WPF'de olay yönlendirmesi, bu genel bakışın ilerleyen bölümlerinde ve Yönlendirilmiş Olaylara Genel Bakışdaha ayrıntılı olarak ele alınmalıdır.
Klavye ve Fare Sınıfları
Temel öğe sınıflarındaki giriş API'sine ek olarak, Keyboard sınıfı ve Mouse sınıfları klavye ve fare girişiyle çalışmak için ek API sağlar.
Keyboard sınıfındaki giriş API'sine örnek olarak, şu anda basılan ModifierKeys döndüren Modifiers özelliği ve belirtilen bir tuşa basılıp basılmadığını belirleyen IsKeyDown yöntemi verilebilir.
Aşağıdaki örnek, bir Key aşağı durumda olup olmadığını belirlemek için GetKeyStates yöntemini kullanır.
// Uses the Keyboard.GetKeyStates to determine if a key is down.
// A bitwise AND operation is used in the comparison.
// e is an instance of KeyEventArgs.
if ((Keyboard.GetKeyStates(Key.Return) & KeyStates.Down) > 0)
{
btnNone.Background = Brushes.Red;
}
' Uses the Keyboard.GetKeyStates to determine if a key is down.
' A bitwise AND operation is used in the comparison.
' e is an instance of KeyEventArgs.
If (Keyboard.GetKeyStates(Key.Return) And KeyStates.Down) > 0 Then
btnNone.Background = Brushes.Red
Mouse sınıfındaki giriş API'sine örnek olarak, ortadaki fare düğmesinin durumunu alan MiddleButtonve fare işaretçisinin şu anda üzerinde olduğu öğeyi alan DirectlyOververilebilir.
Faredeki LeftButton'ın Pressed durumunda olup olmadığını belirleyen aşağıdaki örnek:
if (Mouse.LeftButton == MouseButtonState.Pressed)
{
UpdateSampleResults("Left Button Pressed");
}
If Mouse.LeftButton = MouseButtonState.Pressed Then
UpdateSampleResults("Left Button Pressed")
End If
Mouse ve Keyboard sınıfları bu genel bakış boyunca daha ayrıntılı olarak ele alınmıştır.
Ekran Kalemi Girişi
WPF, Stylusiçin tümleşik desteğe sahiptir. Stylus, Tablet PC tarafından popüler hale gelen bir kalem girişidir. WPF uygulamaları ekran kalemini fare API'sini kullanarak fare olarak ele alabilir, ancak WPF klavye ve fareye benzer bir model kullanan ekran kalemi cihaz soyutlama özelliğini de kullanıma sunar. Ekran kalemiyle ilgili tüm API'ler "Ekran Kalemi" sözcüğünü içerir.
Ekran kalemi fare gibi davranabildiğinden, yalnızca fare girişini destekleyen uygulamalar yine de otomatik olarak bazı ekran kalemi desteği düzeyi elde edebilir. Ekran kalemi bu şekilde kullanıldığında, uygulamaya uygun ekran kalemi olayını işleme fırsatı verilir ve ardından ilgili fare olayını işler. Buna ek olarak, mürekkep girişi gibi üst düzey hizmetler ekran kalemi cihaz soyutlaması aracılığıyla da kullanılabilir. Giriş olarak mürekkep hakkında daha fazla bilgi için bkz. Mürekkep kullanmaya başlama.
Olay Yönlendirme
bir FrameworkElement içerik modelinde alt öğeler olarak diğer öğeleri içerebilir ve bir öğe ağacı oluşturur. WPF'de üst öğe, olayları teslim ederek alt öğelerine veya diğer alt öğelere yönlendirilen girişe katılabilir. Bu, özellikle "denetim bileşimi" veya "birleştirme" olarak bilinen küçük denetimlerden denetim oluşturmak için kullanışlıdır. Öğe ağaçları ve öğe ağaçlarının olay yolları ile ilişkisi hakkında daha fazla bilgi için bkz. WPF
Olay yönlendirme, olayları birden çok öğeye iletme işlemidir, böylece yol boyunca belirli bir nesne veya öğe farklı bir öğe tarafından kaynaklanmış olabilecek bir olaya önemli bir yanıt (işleme aracılığıyla) sunmayı seçebilir. Yönlendirilen olaylar üç yönlendirme mekanizmasından birini kullanır: direkt, kabarcık ve tünelleme. Doğrudan yönlendirmede, kaynak öğe bildirilen tek öğedir ve olay diğer öğelere yönlendirilmemiştir. Ancak, doğrudan yönlendirilen olay yine de standart CLR olaylarının aksine yalnızca yönlendirilen olaylar için mevcut olan bazı ek özellikler sunar. Kabarcıklaşma, öğe ağacında önce olayı oluşturan öğeye, ardından üst öğeye ve bu şekilde devam ederek hareket eder. Tünel oluşturma, öğe ağacının kökünde başlar ve orijinal kaynak öğesiyle biten aşağıya doğru ilerler. Yönlendirilen olaylar hakkında daha fazla bilgi için bkz. Yönlendirilmiş Olaylara Genel Bakış.
WPF giriş olayları genellikle bir tünel olayı ve kabarcıklama olayından oluşan çiftler halinde gelir. Tünelleme olayları, "Önizleme" ön ekiyle kabarcıklanma olaylarından ayırt edilir. Örneğin, PreviewMouseMove bir fare taşıma olayının tünelleme sürümüdür ve MouseMove bu olayın kabarcıklama sürümüdür. Bu olay eşleştirme, öğe düzeyinde uygulanan bir kuraldır ve WPF olay sisteminin doğal bir özelliği değildir. Ayrıntılar için, Yönlendirilmiş Olaylara Genel BakışWPF Giriş Olayları bölümüne bakın.
Giriş Olaylarını İşleme
Bir öğeye giriş almak için bir olay işleyicisi söz konusu olayla ilişkilendirilmelidir. XAML'de bu basittir: bu olayı dinleyecek öğenin özniteliği olarak olayın adına başvurursunuz. Ardından, özniteliğinin değerini, bir temsilciyi temel alarak tanımladığınız olay işleyicisinin adına ayarlarsınız. Olay işleyicisi C# gibi bir kodda yazılmalıdır ve arka planda kod dosyasına eklenebilir.
Klavye olayları, işletim sistemi klavye odağı bir öğe üzerindeyken gerçekleşen tuş eylemlerini bildirdiğinde gerçekleşir. Fare ve ekran kalemi olaylarının her biri iki kategoriye ayrılır: öğeye göre işaretçi konumunda değişiklik bildiren olaylar ve cihaz düğmelerinin durumunda değişiklik olduğunu bildiren olaylar.
Klavye Giriş Olayı Örneği
Aşağıdaki örnek, sol ok tuşuna basıldığını dinler. Buttonolan bir StackPanel oluşturulur. Button örneğine sol ok tuşuna basılmasını dinlemek için bir olay işleyici eklenir.
Örneğin ilk bölümü StackPanel ve Button'i oluşturur ve KeyDowniçin olay işleyicisini ekler.
<StackPanel>
<Button Background="AliceBlue"
KeyDown="OnButtonKeyDown"
Content="Button1"/>
</StackPanel>
// Create the UI elements.
StackPanel keyboardStackPanel = new StackPanel();
Button keyboardButton1 = new Button();
// Set properties on Buttons.
keyboardButton1.Background = Brushes.AliceBlue;
keyboardButton1.Content = "Button 1";
// Attach Buttons to StackPanel.
keyboardStackPanel.Children.Add(keyboardButton1);
// Attach event handler.
keyboardButton1.KeyDown += new KeyEventHandler(OnButtonKeyDown);
' Create the UI elements.
Dim keyboardStackPanel As New StackPanel()
Dim keyboardButton1 As New Button()
' Set properties on Buttons.
keyboardButton1.Background = Brushes.AliceBlue
keyboardButton1.Content = "Button 1"
' Attach Buttons to StackPanel.
keyboardStackPanel.Children.Add(keyboardButton1)
' Attach event handler.
AddHandler keyboardButton1.KeyDown, AddressOf OnButtonKeyDown
İkinci bölüm kodda yazılır ve olay işleyicisini tanımlar. Sol ok tuşuna basıldığında ve Button klavye odağına sahip olduğunda, işleyici çalışır ve Button'nin Background rengi değiştirilir. Tuşa basıldığında ancak sol ok tuşu değilse, Background rengi Button'in başlangıç rengine geri değiştirilir.
private void OnButtonKeyDown(object sender, KeyEventArgs e)
{
Button source = e.Source as Button;
if (source != null)
{
if (e.Key == Key.Left)
{
source.Background = Brushes.LemonChiffon;
}
else
{
source.Background = Brushes.AliceBlue;
}
}
}
Private Sub OnButtonKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
Dim source As Button = TryCast(e.Source, Button)
If source IsNot Nothing Then
If e.Key = Key.Left Then
source.Background = Brushes.LemonChiffon
Else
source.Background = Brushes.AliceBlue
End If
End If
End Sub
Fare Girişi Olayı Örneği
Aşağıdaki örnekte, fare işaretçisi Buttongirdiğinde ButtonBackground rengi değiştirilir. fare Buttonbıraktığında Background rengi geri yüklenir.
Örneğin ilk bölümü StackPanel ve Button denetimlerini oluşturur ve MouseEnter ve MouseLeave olayları için olay işleyicilerini Button'e bağlar.
<StackPanel>
<Button Background="AliceBlue"
MouseEnter="OnMouseExampleMouseEnter"
MouseLeave="OnMosueExampleMouseLeave">Button
</Button>
</StackPanel>
// Create the UI elements.
StackPanel mouseMoveStackPanel = new StackPanel();
Button mouseMoveButton = new Button();
// Set properties on Button.
mouseMoveButton.Background = Brushes.AliceBlue;
mouseMoveButton.Content = "Button";
// Attach Buttons to StackPanel.
mouseMoveStackPanel.Children.Add(mouseMoveButton);
// Attach event handler.
mouseMoveButton.MouseEnter += new MouseEventHandler(OnMouseExampleMouseEnter);
mouseMoveButton.MouseLeave += new MouseEventHandler(OnMosueExampleMouseLeave);
' Create the UI elements.
Dim mouseMoveStackPanel As New StackPanel()
Dim mouseMoveButton As New Button()
' Set properties on Button.
mouseMoveButton.Background = Brushes.AliceBlue
mouseMoveButton.Content = "Button"
' Attach Buttons to StackPanel.
mouseMoveStackPanel.Children.Add(mouseMoveButton)
' Attach event handler.
AddHandler mouseMoveButton.MouseEnter, AddressOf OnMouseExampleMouseEnter
AddHandler mouseMoveButton.MouseLeave, AddressOf OnMosueExampleMouseLeave
Örneğin ikinci bölümü kodla yazılır ve olay işleyicilerini tanımlar. Fare Buttongirdiğinde, ButtonBackground rengi SlateGrayolarak değiştirilir. Fare Button'den ayrıldığında, Button'nin Background rengi AliceBlueolarak geri değiştirilir.
private void OnMouseExampleMouseEnter(object sender, MouseEventArgs e)
{
// Cast the source of the event to a Button.
Button source = e.Source as Button;
// If source is a Button.
if (source != null)
{
source.Background = Brushes.SlateGray;
}
}
Private Sub OnMouseExampleMouseEnter(ByVal sender As Object, ByVal e As MouseEventArgs)
' Cast the source of the event to a Button.
Dim source As Button = TryCast(e.Source, Button)
' If source is a Button.
If source IsNot Nothing Then
source.Background = Brushes.SlateGray
End If
End Sub
private void OnMosueExampleMouseLeave(object sender, MouseEventArgs e)
{
// Cast the source of the event to a Button.
Button source = e.Source as Button;
// If source is a Button.
if (source != null)
{
source.Background = Brushes.AliceBlue;
}
}
Private Sub OnMosueExampleMouseLeave(ByVal sender As Object, ByVal e As MouseEventArgs)
' Cast the source of the event to a Button.
Dim source As Button = TryCast(e.Source, Button)
' If source is a Button.
If source IsNot Nothing Then
source.Background = Brushes.AliceBlue
End If
End Sub
Metin Girişi
TextInput olayı, metin girişini cihazdan bağımsız bir şekilde dinlemenizi sağlar. Klavye, metin girişinin birincil aracıdır, ancak konuşma, el yazısı ve diğer giriş cihazları da metin girişi oluşturabilir.
Klavye girişi için WPF önce uygun KeyDown/KeyUp olaylarını gönderir. Bu olaylar işlenmezse ve anahtar metinselse (yön okları veya işlev tuşları gibi bir denetim tuşu yerine), TextInput olayı tetiklenir. birden çok tuş vuruşu metin girişinin tek bir karakterini oluşturabildiğinden ve tek tuş vuruşları çok karakterli dizeler oluşturabildiğinden, KeyDown/KeyUp ile TextInput olayları arasında her zaman basit bire bir eşleme yoktur. Bu, özellikle ilgili alfabelerinde binlerce olası karakteri oluşturmak için Giriş Yöntemi Düzenleyicileri'ni (IMEs) kullanan Çince, Japonca ve Korece gibi diller için geçerlidir.
WPF bir KeyUp/KeyDown olayı gönderdiğinde, tuş vuruşlarının bir TextInput olayının parçası olabilmesi durumunda KeyKey.System olarak ayarlanır (örneğin, ALT+S tuşlarına basılırsa). Bu, bir KeyDown olay işleyicisindeki kodun Key.System kontrollerini gerçekleştirmesine ve eğer bulunursa, daha sonra tetiklenen TextInput olayının işleyicisine işleme bırakmasına olanak tanır. TextCompositionEventArgs bağımsız değişkeninin çeşitli özellikleri, bu gibi durumlarda özgün tuş vuruşlarını belirlemek için kullanılabilir. Benzer şekilde, bir IME etkin olduğunda, Key değeri Key.ImeProcessedolur ve ImeProcessedKey, özgün tuş vuruşunu veya tuş vuruşlarını verir.
Aşağıdaki örnek, Click olayı için bir işleyici ve KeyDown olayı için bir işleyici tanımlar.
İlk kod veya işaretleme kesimi, kullanıcı arabirimini oluşturur.
<StackPanel KeyDown="OnTextInputKeyDown">
<Button Click="OnTextInputButtonClick"
Content="Open" />
<TextBox> . . . </TextBox>
</StackPanel>
// Create the UI elements.
StackPanel textInputStackPanel = new StackPanel();
Button textInputeButton = new Button();
TextBox textInputTextBox = new TextBox();
textInputeButton.Content = "Open";
// Attach elements to StackPanel.
textInputStackPanel.Children.Add(textInputeButton);
textInputStackPanel.Children.Add(textInputTextBox);
// Attach event handlers.
textInputStackPanel.KeyDown += new KeyEventHandler(OnTextInputKeyDown);
textInputeButton.Click += new RoutedEventHandler(OnTextInputButtonClick);
' Create the UI elements.
Dim textInputStackPanel As New StackPanel()
Dim textInputeButton As New Button()
Dim textInputTextBox As New TextBox()
textInputeButton.Content = "Open"
' Attach elements to StackPanel.
textInputStackPanel.Children.Add(textInputeButton)
textInputStackPanel.Children.Add(textInputTextBox)
' Attach event handlers.
AddHandler textInputStackPanel.KeyDown, AddressOf OnTextInputKeyDown
AddHandler textInputeButton.Click, AddressOf OnTextInputButtonClick
Kodun ikinci kesimi olay işleyicilerini içerir.
private void OnTextInputKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.O && Keyboard.Modifiers == ModifierKeys.Control)
{
handle();
e.Handled = true;
}
}
private void OnTextInputButtonClick(object sender, RoutedEventArgs e)
{
handle();
e.Handled = true;
}
public void handle()
{
MessageBox.Show("Pretend this opens a file");
}
Private Sub OnTextInputKeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
If e.Key = Key.O AndAlso Keyboard.Modifiers = ModifierKeys.Control Then
handle()
e.Handled = True
End If
End Sub
Private Sub OnTextInputButtonClick(ByVal sender As Object, ByVal e As RoutedEventArgs)
handle()
e.Handled = True
End Sub
Public Sub handle()
MessageBox.Show("Pretend this opens a file")
End Sub
Giriş olayları yukarı doğru iletildiğinden, StackPanel klavye odağı hangi öğede olursa olsun girişi alır. önce TextBox denetimi bildirilir ve OnTextInputKeyDown
işleyicisi yalnızca TextBox girişi işlemediyse çağrılır.
KeyDown olay yerine PreviewKeyDown olayı kullanılırsa, önce OnTextInputKeyDown
işleyicisi çağrılır.
Bu örnekte, işleme mantığı iki kez yazılır: bir kez CTRL+O ve düğmenin tıklama olayı için bir kez daha. Bu, giriş olaylarını doğrudan işlemek yerine komutlar kullanılarak basitleştirilebilir. Komutlar bu genel bakışta ve Komutlara Genel Bakış'nde ele alınıyor.
Dokunma ve Düzenleme
Windows 7 işletim sistemindeki yeni donanım ve API, uygulamalara aynı anda birden çok dokunuştan giriş alma olanağı sağlar. WPF, uygulamaların dokunma gerçekleştiğinde olayları oluşturarak fare veya klavye gibi diğer girişlere yanıt vermeye benzer şekilde dokunmayı algılamasını ve yanıtlamasını sağlar.
WPF, dokunma gerçekleştiğinde iki tür olayı kullanıma sunar: dokunma olayları ve işleme olayları. Dokunma olayları, dokunmatik ekran üzerindeki her parmak ve hareketi hakkında ham veriler sağlar. İşleme olayları girişi belirli eylemler olarak yorumlar. Her iki olay türü de bu bölümde açıklanmıştır.
Önkoşullar
Dokunmaya yanıt veren bir uygulama geliştirmek için aşağıdaki bileşenlere ihtiyacınız vardır.
Visual Studio 2010.
Windows 7.
Windows Touch'ı destekleyen dokunmatik ekran gibi bir cihaz.
Terminoloji
Dokunma tartışıldığında aşağıdaki terimler kullanılır.
Touch, Windows 7 tarafından tanınan bir kullanıcı girişi türüdür. Genellikle dokunma, dokunmaya duyarlı bir ekrana parmak koyarak başlatılır. Dizüstü bilgisayarlarda ortak olan dokunmatik yüzey gibi cihazların, cihazın yalnızca fare girişi olarak parmağın konumunu ve hareketini dönüştürmesi durumunda dokunmayı desteklemediğini unutmayın.
Multitouch aynı anda birden fazla noktadan oluşan dokunmadır. Windows 7 ve WPF çoklu dokunmayı destekler. WPF belgelerinde dokunma anlatıldığında, kavramlar çoklu dokunma için geçerlidir.
Dokunma bir nesneye uygulanan fiziksel bir eylem olarak yorumlandığında bir düzenleme oluşur. WPF'de işleme olayları girişi çeviri, genişletme veya döndürme düzenlemesi olarak yorumlar.
touch device
dokunmatik ekranda tek parmak gibi dokunmatik giriş üreten bir cihazı temsil eder.
Dokunmaya Yanıt Veren Denetimler
Aşağıdaki denetimler, bir parmağın görünümü dışına kaydırılmış içerik varsa denetimin üzerinde sürüklenerek kaydırılabilir.
ScrollViewer, dokunma kaydırmanın yatay, dikey, her ikisi veya hiçbiri etkin olup olmadığını belirtmenize olanak tanıyan ScrollViewer.PanningMode ekli özelliğini tanımlar. ScrollViewer.PanningDeceleration özelliği, kullanıcı parmağı dokunmatik ekrandan kaldırdığında kaydırmanın ne kadar hızlı yavaşlayacağini belirtir. eklenmiş ScrollViewer.PanningRatio özelliği, kaydırma ofseti ile dönüştürme manipülasyon ofseti arasındaki oranı belirtir.
Dokunma Olayları
UIElement, UIElement3Dve ContentElementtemel sınıfları, uygulamanızın dokunmaya yanıt vermesi için abone olabileceğiniz olayları tanımlar. Dokunma olayları, uygulamanız dokunmayı bir nesneyi düzenlemekten başka bir şey olarak yorumladığında kullanışlıdır. Örneğin, kullanıcının bir veya daha fazla parmakla çizimini sağlayan bir uygulama dokunma olaylarına abone olur.
Üç sınıf da aşağıdaki olayları tanımlar. Bu olaylar, tanımlayıcı sınıfa bakılmaksızın benzer şekilde davranır.
Klavye ve fare olayları gibi dokunma olayları da yönlendirilmiş olaylardır.
Preview
ile başlayan olaylar tünel olaylarıdır ve Touch
ile başlayan olaylar kabarcıklanma olaylarıdır. Yönlendirilen olaylar hakkında daha fazla bilgi için bkz. Yönlendirilmiş Olaylara Genel Bakış. Bu olayları işlerken, GetTouchPoint veya GetIntermediateTouchPoints yöntemini çağırarak herhangi bir öğeye göre girişin konumunu alabilirsiniz.
Dokunma olayları arasındaki etkileşimi anlamak için, kullanıcının bir parmağı bir öğeye koyduğu, parmağı öğede hareket ettiği ve ardından parmağı öğeden kaldırdığı senaryoyu göz önünde bulundurun. Aşağıdaki çizimde, kabarcıklama olaylarının yürütülmesi gösterilmektedir (tünel olayları basitlik için atlanmıştır).
Dokunma olayları
Aşağıdaki listede, önceki çizimde yer alan olayların sırası açıklanmaktadır.
TouchEnter olayı, kullanıcı öğeye bir parmak koyduğunda bir kez gerçekleşir.
TouchDown olayı bir kez gerçekleşir.
TouchMove olayı, kullanıcı parmağı öğenin içinde hareket ettikçe birden çok kez gerçekleşir.
TouchUp olayı, kullanıcı parmağı öğeden kaldırdığında bir kez gerçekleşir.
TouchLeave olayı bir kez gerçekleşir.
İkiden fazla parmak kullanıldığında, olaylar her parmak için gerçekleşir.
Manipülasyon Etkinlikleri
Bir uygulamanın kullanıcının nesneyi işlemesine olanak sağladığı durumlarda, UIElement sınıfı işleme olaylarını tanımlar. Dokunma konumunu bildiren dokunma olaylarından farklı olarak, işleme olayları girişin nasıl yorumlandığını bildirir. Çeviri, genişletme ve döndürme olmak üzere üç tür işleme vardır. Aşağıdaki listede üç tür işlemenin nasıl çağrıldığı açıklanmaktadır.
Bir nesnenin üzerine bir parmağınızı koyun ve çeviri düzenlemesini çağırmak için parmağı dokunmatik ekranda hareket ettirin. Bu genellikle nesneyi taşır.
Bir nesneye iki parmağınızı yerleştirip parmaklarınızı birbirine yaklaştırarak veya uzaklaştırarak bir genişletme hareketi başlatın. Bu genellikle nesneyi yeniden boyutlandırıyor.
Nesnenin üzerine iki parmağınızı yerleştirin ve döndürme işlemini başlatmak için parmaklarınızı birbirinin etrafında döndürün. Bu genellikle nesneyi döndürür.
Aynı anda birden fazla düzenleme türü oluşabilir.
Nesnelerin işlemelere yanıt vermesine neden olduğunuzda, nesnenin eylemsiz gibi görünmesini sağlayabilirsiniz. Bu, nesnelerinizin fiziksel dünyanın simülasyonunu yapmasını sağlayabilir. Örneğin, bir kitabı bir tablonun üzerine gönderdiğinizde, yeterince zorlarsanız, kitap serbest bırakıldıktan sonra da hareket etmeye devam eder. WPF, kullanıcının parmaklarının nesneyi serbest bırakmasından sonra işleme olaylarını yükselterek bu davranışı simüle etmenizi sağlar.
Kullanıcının nesneyi taşımasını, yeniden boyutlandırmasını ve döndürmesini sağlayan bir uygulama oluşturma hakkında bilgi için bkz. İzlenecek Yol: İlk Dokunmatik Uygulamanızı Oluşturma.
UIElement aşağıdaki işleme olaylarını tanımlar.
Varsayılan olarak, bir UIElement bu işleme olaylarını almaz.
UIElementüzerinde düzenleme olaylarını almak için UIElement.IsManipulationEnabledtrue
olarak ayarlayın.
Manipülasyon Olaylarının Yürütme Yolu
Bir kullanıcının bir nesneyi "attığı" bir senaryo düşünün. Kullanıcı bir parmağı nesnenin üzerine koyar, parmağı dokunmatik ekranda kısa bir mesafe boyunca taşır ve hareket ederken parmağı kaldırır. Bunun sonucu, nesnenin kullanıcının parmağı altında hareket etmesi ve kullanıcı parmağı kaldırdıktan sonra hareket etmeye devam etmesidir.
Aşağıdaki çizimde, işleme olaylarının yürütme yolu ve her olayla ilgili önemli bilgiler gösterilmektedir.
Manipülasyon olayları
Aşağıdaki listede, önceki çizimde yer alan olayların sırası açıklanmaktadır.
ManipulationStarting olayı, kullanıcı nesneye bir parmak yerleştirdiğinde gerçekleşir. Diğer özelliklerin dışında, bu olay ManipulationContainer özelliğini ayarlamanıza olanak tanır. Sonraki olaylarda, manipülasyonun konumu ManipulationContainer'ye göre olacaktır. ManipulationStartingdışındaki olaylarda bu özellik salt okunur olduğundan, ManipulationStarting olayı bu özelliği ayarlayabileceğiniz tek zamandır.
ManipulationStarted olayı daha sonra gerçekleşir. Bu olay, manipülasyonun kaynağını bildirir.
kullanıcının parmakları dokunmatik ekranda hareket ettikçe ManipulationDelta olayı birden çok kez gerçekleşir. ManipulationDeltaEventArgs sınıfının DeltaManipulation özelliği, işlemenin taşıma, genişletme veya çeviri olarak yorumlanıp yorumlanmamış olduğunu bildirir. Burası, bir nesneyi düzenleme işinin çoğunu gerçekleştirdiğiniz yerdir.
ManipulationInertiaStarting olayı, kullanıcının parmaklarının nesneyle iletişimini kaybettiğinde gerçekleşir. Bu olay, eylemsizlik sırasında işlemelerin yavaşlamasını belirtmenizi sağlar. Bu, seçtiğiniz nesnenin farklı fiziksel alanlara veya özniteliklere öykünebilmesini sağlar. Örneğin, uygulamanızın fiziksel dünyadaki öğeleri temsil eden iki nesnesi olduğunu ve birinin diğerinden daha ağır olduğunu varsayalım. Daha ağır nesnenin daha hafif nesneden daha hızlı yavaş olmasını sağlayabilirsiniz.
ManipulationDelta olayı, eylemsizlik oluştuğunda birden çok kez gerçekleşir. Bu olayın, kullanıcının parmaklarının dokunmatik ekranda hareket ettiğinde ve WPF eylemsizlik simülasyonu yaparken gerçekleştiğini unutmayın. Başka bir deyişle, ManipulationDeltaManipulationInertiaStarting olayından önce ve sonra gerçekleşir. ManipulationDeltaEventArgs.IsInertial özelliği, ManipulationDelta olayının eylemsizlik sırasında gerçekleşip gerçekleşmediğini bildirir, böylece bu özelliği denetleyebilir ve değerine bağlı olarak farklı eylemler gerçekleştirebilirsiniz.
ManipulationCompleted olayı, işleme ve eylemsizlik sona erdiğinde gerçekleşir. Diğer bir ifadeyle, tüm ManipulationDelta olayları gerçekleştikten sonra, ManipulationCompleted olayı işlemenin tamamlandığının sinyalini vermek için gerçekleşir.
UIElement, ManipulationBoundaryFeedback olayını da tanımlar. bu olay, ManipulationDelta olayında ReportBoundaryFeedback yöntemi çağrıldığında oluşur. ManipulationBoundaryFeedback olayı, bir nesne sınıra ulaştığında uygulamaların veya bileşenlerin görsel geri bildirim sağlamasına olanak tanır. Örneğin, Window sınıfı ManipulationBoundaryFeedback olayını işler ve kenarıyla karşılaşıldığında pencerenin biraz hareket etmesini sağlar.
ManipulationBoundaryFeedback olay dışındaki herhangi bir işleme olayında olay bağımsız değişkenlerinde Cancel yöntemini çağırarak işlemeyi iptal edebilirsiniz. Cancelçağırdığınızda, manipülasyon olayları artık tetiklenmez ve dokunma işlemleri için fare olayları devreye girer. Aşağıdaki tabloda, işlemenin iptal edilme zamanı ile gerçekleşen fare olayları arasındaki ilişki açıklanmaktadır.
İptal'in çağrıldığı olay | Önceden yapılan giriş için meydana gelen fare olayları |
---|---|
ManipulationStarting ve ManipulationStarted | Fare aşağı olayları. |
ManipulationDelta | Fare basılı tutma ve fare hareket etme olayları. |
ManipulationInertiaStarting ve ManipulationCompleted | Fare aşağı, fare hareketi ve fare yukarı olayları. |
İşleme eylemsiz olduğunda Cancel çağırırsanız yönteminin false
döndürdüğünü ve girişin fare olaylarını tetiklemediğini unutmayın.
Dokunma ve Düzenleme Olayları Arasındaki İlişki
Bir UIElement her zaman dokunma olaylarını alabilir.
IsManipulationEnabled özelliği true
olarak ayarlandığında, UIElement hem dokunma hem de işleme olaylarını alabilir.
TouchDown olayı işlenmezse (yani, Handled özelliği false
), işleme mantığı öğeye dokunmayı yakalar ve işleme olaylarını oluşturur.
Handled özelliği TouchDown olayda true
olarak ayarlanırsa, işleme mantığı işleme olayları oluşturmaz. Aşağıdaki çizimde, dokunma olayları ile işleme olayları arasındaki ilişki gösterilmektedir.
Dokunma ve işleme olayları
Aşağıdaki listede, önceki çizimde gösterilen dokunma ve işleme olayları arasındaki ilişki açıklanmaktadır.
İlk dokunmatik cihaz bir UIElementüzerinde TouchDown olayı oluşturduğunda, işleme mantığı GotTouchCapture olayını oluşturan CaptureTouch yöntemini çağırır.
GotTouchCapture oluştuğunda, işleme mantığı ManipulationStarting olayını oluşturan Manipulation.AddManipulator yöntemini çağırır.
TouchMove olayları gerçekleştiğinde, işleme mantığı ManipulationInertiaStarting olayından önce gerçekleşen ManipulationDelta olayları oluşturur.
Öğedeki son dokunmatik cihaz TouchUp olayını yükselttiğinde, işleme mantığı ManipulationInertiaStarting olayını oluşturur.
Odak
WPF'de odaklanmayla ilgili iki ana kavram vardır: klavye odağı ve mantıksal odak.
Klavye Odağı
Klavye odağı, klavye girişini alan öğeyi ifade eder. Tüm masaüstünde klavye odağı olan tek bir öğe olabilir. WPF'de, klavye odağı olan öğe IsKeyboardFocusedtrue
olarak ayarlanır. statik Keyboard yöntemi FocusedElement, şu anda klavye odağı olan öğeyi döndürür.
Klavye odağı, bir öğeye sekme tuşuyla veya TextBoxgibi belirli öğelerde fareye tıklanarak elde edilebilir. Klavye odağı, Keyboard sınıfındaki Focus yöntemi kullanılarak program aracılığıyla da elde edilebilir. Focus belirtilen öğe klavye odağını vermeyi dener. Focus tarafından döndürülen öğe, şu anda klavye odağı olan öğedir.
Bir öğenin klavye odağını alabilmesi için false
olarak ayarlanmıştır; bu nedenle, bu öğenin odağı alabilmesini istiyorsanız bu özelliği true
olarak ayarlamanız gerekebilir.
Aşağıdaki örnekte, klavye odağını Buttonayarlamak için Focus kullanılır. Bir uygulamada ilk odağı ayarlamak için önerilen yer Loaded olay işleyicisindedir.
private void OnLoaded(object sender, RoutedEventArgs e)
{
// Sets keyboard focus on the first Button in the sample.
Keyboard.Focus(firstButton);
}
Private Sub OnLoaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Sets keyboard focus on the first Button in the sample.
Keyboard.Focus(firstButton)
End Sub
Klavye odağı hakkında daha fazla bilgi için bkz. Odaklanmaya Genel Bakış.
Mantıksal Odak
Mantıksal odak, odak kapsamındaki FocusManager.FocusedElement'ı ifade eder. Uygulamada mantıksal odağı olan birden çok öğe olabilir, ancak belirli bir odak kapsamında mantıksal odağı olan yalnızca bir öğe olabilir.
Odak alanı, alanı içerisindeki FocusedElement'ı takip eden bir kapsayıcı öğedir. Odak odak kapsamından ayrıldığında, odaklanmış öğe klavye odağını kaybeder ancak mantıksal odağı korur. Odak odak kapsamına döndüğünde, odaklanmış öğe klavye odağını alır. Bu, klavye odağının birden çok odak kapsamı arasında değiştirilmesini sağlar, ancak odağa geri dönüldüğünde odak kapsamındaki odaklanmış öğenin odaklanmış öğe olarak kalmasını garanti eder.
Bir öğe, ekli FocusManager özellik IsFocusScopetrue
olarak ayarlanarak veya SetIsFocusScope yöntemi kullanılarak ekli özelliği ayarlayarak kodda Genişletilebilir Uygulama Biçimlendirme Dili'nde (XAML) odak kapsamına dönüştürülebilir.
Aşağıdaki örnek, IsFocusScope ekli özelliğini ayarlayarak StackPanel'ı bir odak kapsamına dönüştürür.
<StackPanel Name="focusScope1"
FocusManager.IsFocusScope="True"
Height="200" Width="200">
<Button Name="button1" Height="50" Width="50"/>
<Button Name="button2" Height="50" Width="50"/>
</StackPanel>
StackPanel focuseScope2 = new StackPanel();
FocusManager.SetIsFocusScope(focuseScope2, true);
Dim focuseScope2 As New StackPanel()
FocusManager.SetIsFocusScope(focuseScope2, True)
WPF'de varsayılan olarak odak kapsamları olan sınıflar Window, Menu, ToolBarve ContextMenu.
Klavye odağı olan bir öğenin ait olduğu odak kapsamı için mantıksal odağı da olur; bu nedenle, odağı Keyboard sınıfında veya temel öğe sınıflarında Focus yöntemiyle bir öğeye ayarlamak, öğe klavye odağını ve mantıksal odağı vermeyi dener.
Odak kapsamındaki odaklanmış öğeyi belirlemek için GetFocusedElementkullanın. Odak kapsamının odaklanmış öğesini değiştirmek için SetFocusedElementkullanın.
Mantıksal odak hakkında daha fazla bilgi için bkz. Odaklanmaya Genel Bakış.
Fare Konumu
WPF giriş API'si, koordinat alanlarıyla ilgili yararlı bilgiler sağlar. Örneğin, koordinat (0,0)
üst sol köşe koordinatıdır, ancak ağacın hangi öğesinin üst sol köşesi? Giriş hedefi olan öğe? Etkinlik işleyicinizi eklediğiniz unsur? Ya da başka bir şey? Karışıklığı önlemek için WPF giriş API'sinde, fare aracılığıyla elde edilen koordinatlarla çalışırken başvuru çerçevenizi belirtmeniz gerekir.
GetPosition yöntemi, fare işaretçisinin belirtilen öğeye göre koordinatını döndürür.
Fare Kontrolü
Fareler, özellikle fare yakalama olarak bilinen bir modal özelliği barındırır. Fare yakalama, sürükle ve bırak işlemi başlatıldığında geçişli giriş durumunu korumak için kullanılır, böylece fare işaretçisinin ekran üzerindeki nominal konumunu içeren diğer işlemler mutlaka gerçekleşmez. Sürükleme sırasında, kullanıcı sürükle ve bırak işlemini durdurmadan tıklayamaz, bu da sürükleme kaynağı fareyi yakaladığı sürece mouseover ipuçlarının çoğunu uygunsuz hale getirir. Giriş sistemi, fare yakalama durumunu belirleyebilen API'lerin yanı sıra fare yakalamayı belirli bir öğeye zorlayabilen veya fare yakalama durumunu temizleyebilecek API'leri kullanıma sunar. Sürükle ve bırak işlemleri hakkında daha fazla bilgi için bkz. Sürükleme ve Bırakma Genel Bakış.
Komutlar
Komutlar, giriş işlemeyi cihaz girişinden daha anlamsal bir düzeyde etkinleştirir. Komutlar, Cut
, Copy
, Paste
veya Open
gibi basit yönergelerdir. Komutlar, komut mantığınızı merkezileştirmek için kullanışlıdır. Aynı komuta, klavye kısayolu veya bir ToolBarüzerinde bir Menuaracılığıyla erişilebilir. Komutlar, komut kullanılamaz duruma geldiğinde denetimleri devre dışı bırakmak için bir mekanizma da sağlar.
RoutedCommand, ICommandWPF uygulamasıdır. Bir RoutedCommand yürütüldüğünde, komut hedefinde bir PreviewExecuted ve bir Executed olayı tetiklenir ve bu olaylar, diğer girişler gibi öğe ağacında tünelleşir ve kabarcıklanır. Bir komut hedefi ayarlanmadıysa, klavye odağı olan öğe komut hedefi olur. Komutu gerçekleştiren mantık bir CommandBinding'a eklenmiştir. Executed olayı, belirli bir komut için CommandBinding'e ulaştığında, CommandBinding üzerindeki ExecutedRoutedEventHandler çağrılır. Bu işleyici komutun eylemini gerçekleştirir.
Komut oluşturma hakkında daha fazla bilgi için bkz. Komuta Genel Bakış.
WPF, ApplicationCommands, MediaCommands, ComponentCommands, NavigationCommandsve EditingCommandsiçeren bir ortak komut kitaplığı sağlar veya kendi komutlarınızı tanımlayabilirsiniz.
Aşağıdaki örnekte, TextBox klavye odağı olduğu varsayılarak tıklandığında TextBoxüzerinde Paste komutunu çağıracak şekilde bir MenuItem nasıl ayarlanacağı gösterilmektedir.
<StackPanel>
<Menu>
<MenuItem Command="ApplicationCommands.Paste" />
</Menu>
<TextBox />
</StackPanel>
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();
// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);
// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;
// Setting the command target to the TextBox
pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As New MenuItem()
' Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem)
mainStackPanel.Children.Add(stackPanelMenu)
mainStackPanel.Children.Add(pasteTextBox)
' Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste
WPF'deki komutlar hakkında daha fazla bilgi için bkz. Komutlara Genel Bakış.
Giriş Sistemi ve Temel Öğeler
Mouse, Keyboardve Stylus sınıfları tarafından tanımlanan ekli olaylar gibi giriş olayları, giriş sistemi tarafından oluşturulur ve çalışma esnasında görsel ağacın çarpma testi temel alınarak nesne modeline belirli bir konumda yerleştirilir.
Mouse, Keyboardve Stylus tarafından ekli olay olarak tanımlanan olayların her biri, UIElement ve ContentElement temel öğe sınıfları tarafından yeni bir yönlendirilmiş olay olarak tekrar görünür hale getirilir. Temel öğeye yönlendirilen olaylar, özgün ekli olayı işleyen ve olay verilerini yeniden kullanan sınıflar tarafından oluşturulur.
Giriş olayı, temel öğe giriş olayı uygulaması aracılığıyla belirli bir kaynak öğeyle ilişkilendirildiğinde, mantıksal ve görsel ağaç nesnelerinin birleşimini temel alan bir olay yolunun geri kalanı aracılığıyla yönlendirilebilir ve uygulama kodu tarafından işlenebilir. Genellikle, hem XAML'de hem de kodda daha sezgisel olay işleyicisi söz dizimini kullanabileceğiniz için, UIElement ve ContentElementüzerindeki yönlendirilmiş olayları kullanarak bu cihazla ilgili giriş olaylarını işlemek daha uygundur. Bunun yerine, işlemi başlatan ekli olayı işlemeyi seçebilirsiniz, ancak birkaç sorunla karşılaşabilirsiniz: eklenen olay temel öğe sınıfı işlemesi tarafından işlenmiş olarak işaretlenebilir ve ekli olaylara işleyici eklemek için gerçek olay söz dizimi yerine erişimci yöntemlerini kullanmanız gerekir.
Sırada Ne Var?
Artık WPF'de girişi işlemek için birkaç tekniğiniz vardır. Ayrıca çeşitli giriş olayı türleri ve WPF tarafından kullanılan yönlendirilmiş olay mekanizmaları hakkında daha iyi bir anlayışa sahip olmanız gerekir.
WPF çerçeve öğelerini ve olay yönlendirmeyi daha ayrıntılı açıklayan ek kaynaklar mevcuttur. Daha fazla bilgi için aşağıdaki genel bakışlara bakın: Komuta Genel Bakış, Odak Genel Bakış, Temel Öğelere Genel Bakış, WPF'de Ağaçlar ve Yönlendirilmiş Olaylara Genel Bakış.
Ayrıca bkz.
.NET Desktop feedback