Girişe Genel Bakış

Windows Presentation Foundation (WPF) alt sistemi, fare, klavye, dokunmatik ve ekran kalemi dahil olmak üzere çeşitli cihazlardan giriş almak için güçlü bir apı sağlar. Bu konuda, WPF tarafından sunulan hizmetler açıklanmakta ve giriş sistemlerinin mimarisi açıklanmaktadır.

Giriş API 'SI

Birincil giriş API 'si pozlaması temel öğe sınıflarında bulunur: UIElement , ContentElement , FrameworkElement , ve FrameworkContentElement . Temel öğeler hakkında daha fazla bilgi için bkz. temel öğelere genel bakış. Bu sınıflar, birkaç kez ad vermek üzere tuş basma, fare düğmeleri, fare tekerleği, fare hareketi, odak yönetimi ve fare yakalama ile ilgili giriş olayları için işlevsellik sağlar. Giriş API 'sini, tüm giriş olaylarını bir hizmet olarak kabul etmek yerine temel öğelere yerleştirerek, giriş mimarisi giriş olaylarının Kullanıcı arabirimindeki belirli bir nesne tarafından doğrulanmasını ve birden fazla öğenin bir giriş olayını işleme fırsatı olduğu bir olay yönlendirme şemasını desteklemesini sağlar. Birçok giriş olayının kendileriyle ilişkili bir çift olay vardır. Örneğin, anahtar aşağı olayı KeyDown ve olayları ile ilişkilendirilir PreviewKeyDown . Bu olaylardaki fark, hedef öğeye yönlendirildikleri bir öğedir. Önizleme olayları, öğe ağacını, kök öğeden hedef öğeye tünel. Kabarcıklanma olayları, hedef öğeden kök öğeye kadar kabarcık. WPF 'deki olay yönlendirme, bu genel bakışın ilerleyen kısımlarında ve yönlendirilmiş olaylara genel bakışbölümünde daha ayrıntılı bir şekilde ele alınmıştır.

Klavye ve fare sınıfları

Temel öğe sınıflarında giriş API 'sine ek olarak Keyboard sınıf ve Mouse sınıflar, klavye ve fare girişi ile çalışmaya YÖNELIK ek API sağlar.

Sınıftaki giriş API 'SI örnekleri KeyboardModifiers , ModifierKeys Şu anda basılmış olan özelliktir ve IsKeyDown belirtilen bir tuşa basıldığını belirleyen yöntemini belirtir.

Aşağıdaki örnek, GetKeyStates bir durumunun aşağı durumunda olup olmadığını anlamak için yöntemini kullanır Key .

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

Sınıf üzerinde giriş API 'SI örnekleri MouseMiddleButton , orta fare düğmesinin durumunu alan ve DirectlyOver fare işaretçisinin Şu anda üzerinde olduğu öğeyi alan öğe olan.

Aşağıdaki örnek, fare üzerinde, durumunda olup olmadığını belirler LeftButtonPressed .

if (Mouse.LeftButton == MouseButtonState.Pressed)
{
    UpdateSampleResults("Left Button Pressed");
}
If Mouse.LeftButton = MouseButtonState.Pressed Then
    UpdateSampleResults("Left Button Pressed")
End If

MouseVe Keyboard sınıfları, bu genel bakış boyunca daha ayrıntılı bir şekilde ele alınmıştır.

Stilus girişi

WPF için tümleşik destek içerir Stylus . , Stylus Tablet PC tarafından popüler hale getirilen bir kalem girişi olur. WPF uygulamaları, fare API 'sini kullanarak ekran kalemini fare olarak kabul edebilir, ancak WPF klavye ve fareye benzer bir model kullanan bir ekran kalemi cihaz soyutlamasını da kullanıma sunar. Ekran kalemi ile ilgili tüm API 'Ler "ekran kalemi" sözcüğünü içerir.

Ekran kalemi bir fare gibi davrandığı için, yalnızca fare girişini destekleyen uygulamalar otomatik olarak belirli bir ekran kalemi desteği elde edebilir. Ekran kalemi böyle bir şekilde kullanıldığında, uygulamaya uygun ekran kalemi olayını işleme ve ardından karşılık gelen fare olayını işleme fırsatı verilir. Ayrıca, mürekkep girişi gibi daha üst düzey hizmetler de ekran kalemi cihaz soyutlama yoluyla kullanılabilir. Giriş olarak mürekkep hakkında daha fazla bilgi için bkz. mürekkeple çalışmayabaşlama.

Olay yönlendirme

FrameworkElement, Diğer öğeleri içerik modelinde bir öğe ağacı oluşturan alt öğeler olarak içerebilir. WPF 'de, üst öğe, olayları teslim ederek alt öğelerine veya diğer alt öğelere yönlendirilen girişe katılabilir. Bu özellikle, "denetim oluşturma" veya "birleştirme" olarak bilinen küçük denetimlerden denetimleri oluşturmak için kullanışlıdır. Öğe ağaçları ve öğe ağaçlarının olay rotalarıyla ilgisi hakkında daha fazla bilgi için bkz. WPF Içindeki ağaçlar.

Olay yönlendirme, olayları birden çok öğeye iletme sürecidir, böylece yol boyunca belirli bir nesne veya öğe, farklı bir öğe tarafından kaynaklı olabilecek bir olaya önemli bir yanıt (işleme aracılığıyla) sunmayı tercih edebilir. Yönlendirilmiş olaylar üç yönlendirme mekanizmalarından birini kullanır: Direct, kabarcıklanma ve tünelleme. Doğrudan yönlendirme içinde, kaynak öğe yalnızca bildirilen tek öğedir ve olay başka hiçbir öğeye yönlendirilmez. Ancak doğrudan yönlendirilmiş olay hala standart CLR olayları yerine yalnızca yönlendirilmiş olaylar için mevcut olan bazı ek yetenekler sunmaktadır. Kabarcıklanma, önce olayı oluşturan öğeyi, sonra üst öğeyi vb. bildirerek öğe ağacını çalışır. Tünel oluşturma, öğe ağacının kökünde başlar ve özgün kaynak öğesiyle biten, aşağı doğru çalışacaktır. Yönlendirilmiş olaylar hakkında daha fazla bilgi için bkz. yönlendirilmiş olaylara genel bakış.

WPF giriş olayları genellikle bir tünel olayından ve kabarcıklanma olayından oluşan çiftler halinde gelir. Tünel olayları, "Önizleme" önekiyle birlikte kabarcıklanma olaylarından ayırt edilir. Örneğin, PreviewMouseMove bir fare taşıma olayının tünel oluşturma sürümüdür ve MouseMove Bu olayın kabarcıklanma sürümüdür. Bu olay eşleştirme, öğe düzeyinde uygulanan ve WPF olay sisteminin devralınmış bir özelliği olmayan bir kuraldır. Ayrıntılar için bkz. yönlendirilmiş olaylara genel bakışIçindeki WPF giriş olayları bölümü.

Giriş olaylarını işleme

Bir öğe üzerinde giriş almak için, bir olay işleyicisinin bu belirli olayla ilişkilendirilmesi gerekir. XAML 'de bu basit bir işlemdir: olayın adına, bu olayı dinleyerek öğenin bir özniteliği olarak başvuracaktır. Daha sonra, bir temsilciyi temel alarak, özniteliğinin değerini 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 plan kod dosyasına eklenebilir.

Klavye odağı bir öğe üzerinde olduğunda, işletim sistemi tarafından oluşan önemli eylemleri rapor ederken klavye olayları meydana gelir. Fare ve Stilus olayları, her biri iki kategoriye ayrılır: öğeye göre işaretçi konumunda değişiklikleri rapor eden olaylar ve cihaz düğmelerinin durumunda değişiklikleri rapor eden olaylar.

Klavye girişi olay örneği

Aşağıdaki örnek bir sol ok tuşuna basarak dinler. ' StackPanel A sahip olan bir oluşturulur Button . Sol ok tuşuna basarak dinlenecek bir olay işleyicisi Button örneğe iliştirilir.

Örneğin ilk bölümü, öğesini oluşturur ve StackPanelButton için olay işleyicisini iliştirir KeyDown .

<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ğı varsa, işleyici çalışır ve Background rengi Button değiştirilir. Anahtara basıldığında, ancak sol ok tuşu değilse, Background rengi Button Başlangıç rengine geri dönüştürülür.

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, Background fare işaretçisi öğesine girdiğinde bir a rengi Button değişir Button . BackgroundFare öğesinden ayrıldığında renk geri yüklenir Button .

Örneğin ilk bölümü, StackPanel ve Button denetimini oluşturur ve olay işleyicilerini MouseEnter ve MouseLeave olaylarını öğesine ekler Button .

<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ü kodda yazılır ve olay işleyicilerini tanımlar. Fare öğesine girdiğinde, ButtonBackground rengi Button olarak değiştirilir SlateGray . Fare ' ı terk ettiğinde, ButtonBackground rengi Button öğesine geri değişir AliceBlue .

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

TextInputOlay, metin girişini cihazdan bağımsız şekilde dinlemenize olanak sağlar. Klavye, metin girişinin birincil yöntemidir, ancak konuşma, el yazısı ve diğer giriş cihazları da metin girişi oluşturabilir.

Klavye girişi için WPF öncelikle ilgili KeyDown/KeyUp olayları gönderir. Bu olaylar işlenmezse ve anahtar metinsel ise (yön okları veya işlev anahtarları gibi bir denetim anahtarı yerine), bir TextInput olay tetiklenir. KeyDown/KeyUpTextInput Birden çok tuş vuruşu metin girişi için tek bir karakter oluşturabileceği ve tek tuş vuruşlarının birden çok karakterli dizeler oluşturabileceği için, ve olayları arasında her zaman basit bir bire bir eşleme yoktur. Bu özellikle, ilgili harflerden itibaren binlerce olası karakteri oluşturmak için giriş yöntemi düzenleyicileri (IME 'Ler) kullanan Çince, Japonca ve Korece gibi diller için geçerlidir.

WPF bir olay gönderdiğinde KeyUp/KeyDown , KeyKey.System tuş vuruşları bir olayın parçası haline gelirse TextInput (örneğin, alt + S basılıysa), olarak ayarlanır. Bu, bir KeyDown olay işleyicisindeki kodun olup olmadığını kontrol etmesine izin verir Key.System ve bulunursa, daha sonra oluşturulan etkinliğin işleyicisi için işlemeyi bırakır TextInput . Bu durumlarda, TextCompositionEventArgs bağımsız değişkenin çeşitli özellikleri orijinal tuş vuruşlarını belirlemede kullanılabilir. Benzer şekilde, bir IME etkinse, Key değerine sahiptir Key.ImeProcessed ve ImeProcessedKey özgün tuş vuruşunu veya tuş vuruşlarını verir.

Aşağıdaki örnek, olayı için bir işleyici Click ve olay için bir işleyici tanımlar KeyDown .

İlk kod veya biçimlendirme segmenti 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

İkinci kod segmenti 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ı, olay yolunu kabarcıkdığı için, StackPanel hangi öğenin klavye odağına sahip olduğuna bakılmaksızın girişi alır. TextBoxÖnce denetim bilgilendirilir ve OnTextInputKeyDown işleyici yalnızca girişi gerçekleştirmediyseniz çağrılır TextBox . Olay PreviewKeyDown yerine olay kullanılıyorsa KeyDown , OnTextInputKeyDown işleyici ilk olarak çağırılır.

Bu örnekte, işleme mantığı iki kez yazılır — CTRL + O için bir kez ve düğmenin Click olayı için bir kez. Bu, giriş olaylarını doğrudan işlemek yerine komutları kullanılarak basitleştirilebilir. Komutlar bu genel bakışta ve komut, komuta genel bakışbölümünde ele alınmıştır.

Dokunmatik ve düzenleme

Windows 7 işletim sistemindeki yeni donanım ve apı, uygulamaların birden çok dokunduğundan aynı anda giriş almasına olanak sağlar. WPF, uygulamaların, dokunma gerçekleştiğinde olayları yükselterek fare veya klavye gibi diğer girişe yanıt vermeye benzer şekilde, dokunmatik bir şekilde algılamasına ve yanıt vermesine olanak sağlar.

WPF, dokunma gerçekleştiğinde iki tür olay sunar: dokunma olayları ve işleme olayları. Dokunma olayları, dokunmatik ekranda ve hareket üzerindeki her parmakla ilgili ham verileri sağlar. İşleme olayları, girişi belirli eylemler olarak yorumlar. Her iki olay türü de bu bölümde ele alınmıştır.

Önkoşullar

Dokunarak 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'i destekleyen dokunmatik ekran gibi bir cihaz.

Terminoloji

Dokunma konusu tartışılırken aşağıdaki terimler kullanılır.

  • Dokunma, 7. kullanıcı girişi tarafından tanınan bir Windows türü. Dokunma genellikle dokunmaya duyarlı bir ekrana parmaklar koyarak başlatılır. Dizüstü bilgisayarlarda yaygın olarak kullanılan dokunmatik yüzey gibi cihazların, cihaz yalnızca fare girişi olarak parmak konumunu ve hareketini dönüştürse dokunmayı desteklemez.

  • Çoklu dokunma aynı anda birden fazla noktadan oluşan dokunmadır. Windows 7 ve WPF çoklu dokunmayı destekler. WPF belgelerinde dokunma her tartışılırsa kavramlar çoklu dokunma için geçerlidir.

  • Dokunma, bir nesneye uygulanan fiziksel bir eylem olarak yorumlanır. WPF'de işleme olayları girişi çeviri, genişletme veya döndürme işlemesi olarak yorumlar.

  • , touch device dokunmatik ekranda tek parmak gibi dokunma girişi üreten bir cihazı temsil eder.

Dokunmaya Yanıt Veren Denetimler

Aşağıdaki denetimler, görünümün dışında kaydırmış içeriğe sahipse denetimin genelinde bir parmak sürükleyerek kaydırılabilir.

, dokunma kaydırma özelliğinin yatay, dikey, her ikisi de veya hiçbiri için etkin olup olmadığını belirtmenize olanak ScrollViewerScrollViewer.PanningMode sağlayan ekli özelliği tanımlar. ScrollViewer.PanningDecelerationözelliği, kullanıcı parmakla dokunmayı dokunmatik ekrandan kaldıran kaydırmanın ne kadar hızlı yavaşlay olduğunu belirtir. Ekli ScrollViewer.PanningRatio özelliği, kaydırma uzaklığının işleme uzaklığını çevirmek için oranını belirtir.

Dokunma Olayları

Temel sınıflar UIElement , UIElement3D ve , , ContentElement uygulamanıza dokunmaya yanıt vermek için abone olabilirsiniz olayları tanımlar. Dokunma olayları, uygulamanıza dokunmayı bir nesneyi manipüle etmeyen bir şey olarak yorumlayanlar için kullanışlıdır. Örneğin, bir kullanıcının bir veya daha fazla parmakla çizmeye olanak sağlayan bir uygulama dokunma olaylarına abone olur.

Üç sınıf da, tanımlayan sınıftan bağımsız olarak benzer şekilde davranan aşağıdaki olayları tanımlar.

Klavye ve fare olayları gibi dokunma olayları da yönlendiren olaylardır. ile başlayan olaylar, tünel olayları ve ile Preview başlayan olaylar ise Touch bursile olaylardır. Yönlendirilen olaylar hakkında daha fazla bilgi için bkz. Yönlendirilen Olaylara Genel Bakış. Bu olayları işleyenin, veya yöntemini çağırarak herhangi bir öğeye göre girişin konumunu GetTouchPointGetIntermediateTouchPoints elde edersiniz.

Dokunma olayları arasındaki etkileşimi anlamak için, kullanıcının bir öğeye bir parmak koyarak, öğeyi parmakla harekettüğü ve ardından parmakla öğeyi kaldıran bir senaryoyu düşünün. Aşağıdaki çizimde, basitlik açısından tünel olaylarının (tünel olayları atlanmıştır) yürütülmesi gösterilmiştir.

The sequence of touch events. Dokunma olayları

Aşağıdaki liste, önceki çizimde yer alan olayların sırasını açıklar.

  1. Olay, TouchEnter kullanıcı öğeye parmak koyarken bir kez gerçekleşir.

  2. Olay TouchDown bir kez gerçekleşir.

  3. Kullanıcı, TouchMove öğenin içinde parmak hareket ettiğinde olay birden çok kez gerçekleşir.

  4. Olay, TouchUp kullanıcı öğeden parmak kaldıran bir kez gerçekleşir.

  5. Olay TouchLeave bir kez gerçekleşir.

İkiden fazla parmak kullanılırsa olaylar her parmak için gerçekleşir.

Düzenleme Olayları

Bir uygulamanın kullanıcının bir nesneyi işlemeye olanakladığı durumlarda, UIElement sınıfı işleme olaylarını tanımlar. Yalnızca dokunma konumunu raporlayan dokunma olaylarının aksine, işleme olayları girişin nasıl yorumlandırılay olduğunu rapor eder. Üç tür işleme vardır: çeviri, genişletme ve döndürme. Aşağıdaki listede, üç tür işlemenin nasıl çağrıldığında açıklayın.

  • Bir nesnenin üzerine bir parmak koyarak, çeviri işlemesini çağırmak için parmakla dokunmatik ekranda hareket ettirin. Bu genellikle nesneyi taşır.

  • Bir nesnenin üzerine iki parmak koyarak, genişletme işlemesini çağırmak için parmakları birbirine yaklaştırın veya diğer nesnelerden daha uzak bir yere hareket ettirin. Bu genellikle nesneyi yeniden boyutlandırılır.

  • Bir nesneye iki parmak koyarak döndürme işlemesi çağırmak için parmakları birbirine döndürün. Bu genellikle nesneyi döndürer.

Aynı anda birden fazla işleme türü oluşabilir.

Nesnelerin işlemelere yanıt vermelerine neden olurken, nesnenin inersizlik olarak görünmesini sebilirsiniz. Bu, nesnelerinizin fiziksel dünyanın simülasyonunu yapmalarını sağlar. Örneğin, bir kitabı bir tablonun tamamına iterek yeterince zorlarsanız, kitabı serbest bırakarak taşımaya devam edersiniz. WPF, kullanıcının parmakları nesneyi serbest bıraktırdikten sonra işleme olayları çıkararak bu davranışın benzetimini oluşturmana olanak sağlar.

Kullanıcının nesneyi taşıması, yeniden boyutlandırması ve döndürmesini sağlayan bir uygulama oluşturma hakkında bilgi için bkz. Walkthrough: Creating Your First Touch Application.

, UIElement aşağıdaki işleme olaylarını tanımlar.

Varsayılan olarak, bir UIElement bu işleme olaylarını almaz. üzerinde işleme olaylarını almak için UIElement olarak UIElement.IsManipulationEnabledtrue ayarlayın.

Düzenleme Olaylarının Yürütme Yolu

Kullanıcının bir nesneyi "atarak" bir senaryoyu düşünün. Kullanıcı nesnenin üzerine bir parmak koyar, kısa bir mesafe için parmakla dokunmatik ekranda hareket eder ve hareket ederken parmak kaldırır. Bunun sonucu, nesnenin kullanıcının parmak altına taşınacak ve kullanıcı parmaklarını kaldıran sonra da hareket edecek şekilde devam edecek.

Aşağıdaki çizimde, işleme olaylarının yürütme yolu ve her olayla ilgili önemli bilgiler gösterilmiştir.

The sequence of manipulation events. Düzenleme olayları

Aşağıdaki liste, önceki çizimde yer alan olayların sırasını açıklar.

  1. Olay, ManipulationStarting kullanıcı nesneye bir parmak koyarak gerçekleşir. Diğer şeylerin arasında bu olay özelliği ayarlamaya olanak ManipulationContainer sağlar. Sonraki olaylarda, işlemenin konumu ile ilgili ManipulationContainer olur. dışında olaylarda bu özellik salt okunur, bu nedenle ManipulationStarting bu özelliği ayar yalnızca ManipulationStarting olaydır.

  2. Bundan ManipulationStarted sonra olay gerçekleşir. Bu olay, işlemenin kaynağını raporlar.

  3. Olay, ManipulationDelta kullanıcının parmakları dokunmatik ekran üzerinde hareket etti olarak birden çok kez gerçekleşir. sınıfının DeltaManipulation özelliği, ManipulationDeltaEventArgs işlemenin taşıma, genişletme veya çeviri olarak yorumlanır olup olmadığını raporlar. Burada, bir nesneyi işlerken çoğu işlemi gerçekleştirebilirsiniz.

  4. Olay, ManipulationInertiaStarting kullanıcının parmakları nesneyle iletişimini kaybettiğinde gerçekleşir. Bu olay, verimsizlik sırasında işlemelerin ertelenimlerini belirtmenize olanak sağlar. Bu nedenle, nesneniz farklı fiziksel alanlara veya özniteliklere öykünebilirsiniz. Örneğin, uygulamanıza fiziksel dünyada öğeleri temsil eden iki nesne olduğunu ve birinin diğerini daha ağır olduğunu varsayalım. Daha ağır olan nesnenin daha hafif nesneden daha hızlı bir şekilde kararttırabilirsiniz.

  5. Olay, ManipulationDelta verimsizlik oluştuğunda birden çok kez gerçekleşir. Bu olayın, kullanıcının parmakları dokunmatik ekran üzerinden hareket ettir geldiğinde ve WPF'nin hareketsizlik simülasyonu sırasında oluştuğuna dikkat etmek gerekir. Başka bir deyişle, ManipulationDelta olaydan önce ve sonra ManipulationInertiaStarting gerçekleşir. özelliği, olayın eylemsizlik sırasında olup olmadığını raporlar, bu nedenle özelliği kontrol edip değerine bağlı ManipulationDeltaEventArgs.IsInertialManipulationDelta olarak farklı eylemler gerçekleştirin.

  6. Olay, ManipulationCompleted işleme ve herhangi bir aksama sona erdiğinde gerçekleşir. Başka bir ifadeyle, tüm olaylar meydana gelir ve olay, ManipulationDeltaManipulationCompleted işlemenin tamam olduğunu işaret etmek için gerçekleşir.

ayrıca UIElement olayı ManipulationBoundaryFeedback tanımlar. Bu olay, ReportBoundaryFeedback olayda yöntemi çağrıldıklarında ManipulationDelta oluşur. Olay, ManipulationBoundaryFeedback bir nesne sınıra geldiğinde uygulama veya bileşenlerin görsel geri bildirim sağlamalarını sağlar. Örneğin sınıfı, Window uç ile ManipulationBoundaryFeedback karşılaşıldıklarında pencerenin biraz hareket etmelerine neden olmak için olayı işler.

olay dışında herhangi bir işleme olayında olay bağımsız değişkenlerini yöntemini Cancel çağırarak işlemeyi iptal ManipulationBoundaryFeedback edebilirsiniz. Cancelçağrısında, işleme olayları artık yükselt olmaz ve dokunma için fare olayları oluşur. Aşağıdaki tabloda, işlemenin iptal edildiği zaman ile oluşan fare olayları arasındaki ilişki açıklandı.

İptal'in çağrıldı olduğu olay Zaten oluşan giriş için oluşan fare olayları
ManipulationStarting ve ManipulationStarted Fareyle aşağı doğru olaylar.
ManipulationDelta Fare aşağı ve fareyle taşıma olayları.
ManipulationInertiaStarting ve ManipulationCompleted Fare aşağı, fare hareket ve yukarı fare olayları.

düzenlemesi inersizlik olduğunda çağrısı yaparsanız yöntemin döndür olduğunu ve Cancelfalse girişin fare olaylarını neden olmadığını unutmayın.

Dokunma ve İşleme Olayları Arasındaki İlişki

bir UIElement her zaman dokunma olayları alır. IsManipulationEnabledÖzelliği olarak ayarlandığında true , bir, UIElement hem dokunma hem de işleme olaylarını alabilir. TouchDownOlay işlenmezse (yani, Handled özelliği ise false ), işleme mantığı öğesine dokunarak öğesini yakalar ve işleme olaylarını oluşturur. HandledÖzelliği olayda olarak ayarlandıysa trueTouchDown , işleme mantığı işleme olayları oluşturmaz. Aşağıdaki çizimde, dokunma olayları ve işleme olayları arasındaki ilişki gösterilmektedir.

Relationship between touch and manipulation events Dokunmatik ve işleme olayları

Aşağıdaki listede, önceki çizimde gösterilen dokunma ve işleme olayları arasındaki ilişki açıklanmaktadır.

Odaklanma

WPF 'ye odaklanmak için ilgili iki ana kavram vardır: klavye odağı ve mantıksal odak.

Klavye odağı

Klavye odağı, klavye girişi alan öğe anlamına gelir. Klavye odaklı bütün masaüstünde yalnızca bir öğe olabilir. WPF 'de, klavye odağına sahip olan öğe IsKeyboardFocused olarak ayarlanır true . Static Keyboard yöntemi FocusedElement Şu anda klavye odağına sahip olan öğeyi döndürür.

Klavye odağı bir öğeye sekme ile veya gibi belirli öğelerde fareyle tıklanarak elde edilebilir TextBox . Klavye odağı Ayrıca, sınıfındaki yöntemi kullanılarak programlı bir şekilde elde edilebilir FocusKeyboard . Focus belirtilen öğeye klavye odağı verme girişiminde bulunur. Tarafından döndürülen öğe, Focus Şu anda klavye odağına sahip olan öğedir.

Bir öğenin klavye odağını alması için Focusable özelliği ve IsVisible özellikleri Focusableolarak ayarlanmalıdır. Gibi bazı sınıflar varsayılan olarak olarak PanelFocusable ayarlanmıştır; bu false nedenle, bu true öğenin odağı elde edebilmesini istiyorsanız, bu özelliği olarak ayarlamanız gerekebilir.

Aşağıdaki örnek Focus bir üzerinde klavye odağı ayarlamak için kullanır Button . Bir uygulamada ilk odağı ayarlamak için önerilen yer Loaded olay işleyicisidir.

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. odağa genel bakış.

Mantıksal odak

Mantıksal odak, FocusManager.FocusedElement bir odak kapsamındaki öğesine başvurur. Bir uygulamada mantıksal odağa sahip birden fazla öğe olabilir, ancak yalnızca belirli bir odak kapsamında mantıksal odağa sahip bir öğe olabilir.

Odak kapsamı, kapsamı içinde izlemeyi tutan bir kapsayıcı öğesidir FocusedElement . Odak bir odak kapsamından ayrıldığında, odaklanmış öğe klavye odağını kaybedecektir ancak mantıksal odağı korur. Odak odak kapsamına döndüğünde, odaklanmış öğe klavye odağını elde eder. Bu, klavye odağının birden çok odak kapsamı arasında değiştirilmesini sağlar, ancak odak kapsamındaki Yöntem odaklanan öğe, odak döndürüldüğünde odaklanmış öğe olarak kalır.

Bir öğe, ekli özelliği olarak ayarlayarak Extensible Application Markup Language (XAML) içindeki bir odak kapsamına FocusManagerIsFocusScopetrue ya da yöntemi kullanılarak ekli özelliği ayarlayarak kod içinde etkinleştirilebilir SetIsFocusScope .

Aşağıdaki örnek, StackPanel ekli özelliği ayarlayarak bir odak kapsamı içinde oluşturur IsFocusScope .

<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 içindeki sınıflar, varsayılan olarak,,, Window ve ' Menu dir ToolBarContextMenu .

Klavye odağına sahip bir öğe, ait olduğu odak kapsamı için mantıksal odağa de sahip olur; Bu nedenle, sınıf veya temel öğe sınıflarında yöntemi olan bir öğe üzerinde odağı ayarlamak, FocusKeyboard öğe klavyesi odağı ve mantıksal odağı vermenizi dener.

Odaklanmış öğeyi bir odak kapsamında tespit etmek için kullanın GetFocusedElement . Odak kapsamı için odaklanmış öğeyi değiştirmek için kullanın SetFocusedElement .

Mantıksal odak hakkında daha fazla bilgi için bkz. odağa genel bakış.

Fare konumu

WPF giriş API 'SI, boşluk koordinasyonu ile ilgili yararlı bilgiler sağlar. Örneğin, koordinat (0,0) üst sol koordinatı, ancak ağacın sol üst öğesi mi? Giriş hedefi olan öğe? Olay işleyicinizi eklediğiniz öğe? Veya başka bir şey var mı? Karışıklığı önlemek için WPF giriş API 'SI, fare aracılığıyla elde edilen koordinatlarla çalışırken başvuru çerçevenize belirtmenizi gerektirir. GetPositionYöntemi, belirtilen öğeye göre fare işaretçisinin koordinatını döndürür.

Fare yakalama

Fare cihazları özellikle, fare yakalama olarak bilinen kalıcı bir özelliği tutar. Fare yakalama, bir sürükle ve bırak işlemi başlatıldığında geçici giriş durumunu korumak için kullanılır. böylece, fare işaretçisinin nominal ekran üzerindeki konumunu içeren diğer işlemler gerçekleşmeyebilir. Sürükleme sırasında, Kullanıcı sürükle ve bırak işlemi iptal etmeden tıklalayamaz ve fare yakalama, sürükleme kökeni tarafından bekletilirken birçok gelme olayından simgesini uygunsuz hale getirir. Giriş sistemi, fare yakalama durumunu belirleyebilen API 'Leri ve belirli bir öğeye fare yakalamayı zorlayabileceğiniz API 'leri ve fare yakalama durumunu temizleyebilir. Sürükle ve bırak işlemleri hakkında daha fazla bilgi için bkz. sürükleyip bırakma genel bakış.

Komutlar

Komutlar, giriş işlemesini cihaz girişinden daha anlamsal bir düzeyde etkinleştirir. Komutları,,, veya gibi basit yönergelerden yapılır CutCopyPasteOpen . Komutlar, komut mantığınızı merkezileştirirken faydalıdır. Aynı komuta, bir MenuToolBar veya bir klavye kısayolu aracılığıyla bir veya ' den erişilebilir. Komutlar Ayrıca, komut kullanılamaz hale geldiğinde denetimleri devre dışı bırakmak için bir mekanizma sağlar.

RoutedCommand , öğesinin WPF uygulamasıdır ICommand . Bir RoutedCommand yürütüldüğünde bir PreviewExecuted ve olayı, Executed komut hedefinde tetiklenir ve bu, diğer giriş gibi öğe ağacı aracılığıyla tünel ve balon alır. Bir komut hedefi ayarlanmamışsa, klavye odaklı öğe komut hedefi olacaktır. Komutunu gerçekleştiren mantığı öğesine iliştirilir CommandBinding . Bir Executed olay o belirli bir komut için bir öğesine ulaştığında, ' nde CommandBindingExecutedRoutedEventHandlerCommandBinding çağrılır. Bu işleyici komutun eylemini gerçekleştirir.

Verme hakkında daha fazla bilgi için bkz. komutlama genel bakış.

WPF,,,, ve ' den oluşan ortak komutlar kitaplığı sağlar ApplicationCommandsMediaCommandsComponentCommandsNavigationCommandsEditingCommands veya kendinizinkini tanımlayabilirsiniz.

Aşağıdaki örnek, bir, MenuItem tıklatılınca, PasteTextBox klavye odağına sahip olduğunu varsayarak, üzerinde komutunu çağıracağı için nasıl ayarlanacağını gösterir TextBox .

<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 komutları hakkında daha fazla bilgi için bkz. komut verme genel bakış.

Giriş sistemi ve temel öğeler

,, Ve sınıfları tarafından tanımlanan ekli olaylar gibi giriş olayları, MouseKeyboardStylus giriş sistemi tarafından oluşturulur ve çalışma zamanında görsel ağacı isabet testi temelinde nesne modelinde belirli bir konuma eklenir.

, MouseKeyboard Ve Stylus ekli olay olarak tanımlayan olayların her biri, temel öğe sınıfları UIElement ve ContentElement Yeni bir yönlendirilmiş olay olarak da yeniden kullanıma sunulur. Temel öğe yönlendirilmiş olayları, özgün ekli olayı işleyen ve olay verilerini yeniden çalıştıran sınıflar tarafından oluşturulur.

Giriş olayı, temel öğe girişi olay uygulaması aracılığıyla belirli bir kaynak öğesiyle ilişkili olduğunda, 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, UIElementContentElement hem xaml 'de hem de kodda daha sezgisel olay işleyicisi sözdizimi kullanabileceğiniz için, bu cihazla ilgili giriş olaylarını ve üzerinde yönlendirilmiş olayları kullanarak işlemek daha uygundur. Bunun yerine işlemi başlatan ekli olayı işlemeyi seçebilirsiniz, ancak çeşitli sorunlar yaşayabilirsiniz: Ekli olay temel öğe sınıfı işlemesi tarafından işlenmiş olarak işaretlenebilir ve ekli olaylara yönelik işleyiciler iliştirmek için doğru 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ç teknikte sahipsiniz. Ayrıca, çeşitli giriş olayları türleri ve WPF tarafından kullanılan yönlendirilmiş olay mekanizmaları hakkında gelişmiş bir bilgiye sahip olmanız gerekir.

WPF çerçevesi öğelerini ve olay yönlendirmeyi daha ayrıntılı olarak açıklayan ek kaynaklar mevcuttur. Daha fazla bilgi, komut veren genelbakış, odağa genelbakış, temel öğelere genel bakış, WPF 'deki ağaçlarve yönlendirilmiş olaylara genelbakış için aşağıdaki genel bakışlara bakın

Ayrıca bkz.