Přehled vstupu

Windows Presentation Foundation (WPF)Podsystém poskytuje výkonné rozhraní API pro získání vstupu z nejrůznějších zařízení, včetně myši, klávesnice, dotyku a stylusu. Toto téma popisuje služby poskytované nástrojem WPF a vysvětluje architekturu vstupních systémů.

Vstupní rozhraní API

V základních třídách elementů se nachází primární vstupní rozhraní API: UIElement , ContentElement , FrameworkElement a FrameworkContentElement . Další informace o základních elementech naleznete v tématu Přehled základních prvků. Tyto třídy poskytují funkce pro vstupní události, které souvisí s klíčovými klávesami, tlačítky myši, kolečkem myši, pohybem myši, správou fokusu a zachytáváním myši, pokud chcete pojmenovat několik. Vložením vstupního rozhraní API na základní prvky namísto zpracování všech vstupních událostí jako služby umožňuje vstupní architektura, aby se vstupní události nastavily konkrétním objektem v uživatelském rozhraní, a pro podporu schématu směrování událostí, při kterém více než jeden prvek má příležitost zpracovat vstupní událost. K mnoha vstupním událostem je přidružen pár událostí. Například událost stisknutí klíče je přidružena k KeyDown PreviewKeyDown událostem a. Rozdíl v těchto událostech je ve způsobu, jakým jsou směrovány do cílového prvku. Události ve verzi Preview propojující strom elementů od kořenového elementu až po cílový element. Probublávání události z cílového prvku do kořenového elementu. Směrování událostí v nástroji WPF je podrobněji popsáno dále v tomto přehledu a v tématu Přehled směrovaných událostí.

Třídy klávesnice a myši

Kromě vstupního rozhraní API na základních třídách prvků Keyboard poskytuje třída a Mouse třídy další rozhraní API pro práci s vstupy klávesnice a myši.

Příklady vstupního rozhraní API Keyboard třídy jsou Modifiers vlastnost, která vrací ModifierKeys aktuálně stisknutou a IsKeyDown metodu, která určuje, zda je zadaný klíč stisknut.

Následující příklad používá GetKeyStates metodu k určení, zda Key je v nefunkčním stavu.

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

Příklady vstupního rozhraní API Mouse třídy jsou MiddleButton , které získá stav prostřední tlačítko myši a DirectlyOver , které Získá prvek ukazatel myši v tuto chvíli.

Následující příklad určuje, zda LeftButton je ukazatel myši ve Pressed stavu.

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

MouseTřídy a Keyboard jsou podrobněji popsány v rámci tohoto přehledu.

Vstup stylusu

WPF má integrovanou podporu pro Stylus . StylusJe vstup perem, který je oblíbený v počítači tabletu. WPF aplikace mohou používat Stylus jako myš pomocí rozhraní Mouse API, ale WPF také zpřístupňuje abstrakci zařízení stylusu, která používá model podobný klávesnici a myši. Všechna rozhraní API související s stylusem obsahují slovo Stylus.

Vzhledem k tomu, že Stylus může fungovat jako myš, aplikace, které podporují jenom vstupy myši, můžou dál získávat automaticky určitou úroveň podpory stylusem. Pokud je Stylus použit takovým způsobem, aplikace je dána příležitostí ke zpracování příslušné události stylus a poté zpracuje příslušnou událost myši. Kromě toho jsou k dispozici také služby vyšší úrovně, jako je například vstup z inkoustu, a to prostřednictvím abstrakce zařízení stylus. Další informace o rukopisu jako vstup naleznete v tématu Začínáme with Ink.

Směrování událostí

FrameworkElementMůže obsahovat další prvky jako podřízené elementy v jejím modelu obsahu, tvořící strom elementů. V nástroji se WPF nadřazený element může zúčastnit vstupu směrovaného na jeho podřízené prvky nebo jiné následníky pomocí předání událostí. To je užitečné hlavně při sestavování ovládacích prvků z menších ovládacích prvků, což je proces známý jako "složení ovládacího prvku" nebo "skládání". Další informace o stromech elementů a o tom, jak struktury prvků souvisejí s trasami událostí, naleznete v tématu stromy v WPF.

Směrování událostí je proces předávání událostí více prvkům, aby určitý objekt nebo prvek podél trasy mohl nabízet významnou odpověď (prostřednictvím zpracování) k události, která by mohla být zadávána jiným prvkem. Směrované události používají jeden ze tří mechanismů směrování: přímé, probublávání a tunelové propojení. V přímém směrování je zdrojový prvek jediným oznámeným prvkem a událost není směrována na žádné jiné prvky. Nicméně přímá směrovaná událost stále nabízí některé další možnosti, které jsou k dispozici pouze pro směrované události na rozdíl od standardních událostí CLR. Probublávání sestaví strom elementů pomocí prvního upozorňování elementu, který zdroj události nastavil, pak nadřazeného elementu a tak dále. Tunelové propojení začíná v kořenovém adresáři stromu prvků a funguje dolů a končí původním zdrojovým elementem. Další informace o směrovaných událostech najdete v tématu Přehled směrovaných událostí.

WPF události vstupu obecně přicházejí do párů, které se skládají z tunelové události a události probublávání. Události tunelování se odlišují od probublávání událostí s předponou Preview. Například jedná se o PreviewMouseMove tunelovou verzi události přesunutí myši a jedná se o MouseMove verzi této události probublávání. Toto párování událostí je konvence, která je implementována na úrovni prvku a není podstatou funkcí WPF systému událostí. Podrobnosti najdete v oddílu události vstupu WPF v tématu směrované události – přehled.

Zpracování událostí vstupu

Pro příjem vstupu elementu musí být obslužná rutina události přidružena k této konkrétní události. V XAML tomto případě je to jasné: odkazujete na název události jako atribut prvku, který bude pro tuto událost naslouchat. Potom nastavíte hodnotu atributu na název obslužné rutiny události, kterou definujete, na základě delegáta. Obslužná rutina události musí být napsána v kódu, jako je například C#, a může být obsažena v souboru kódu na pozadí.

K událostem klávesnice dojde v případě, že operační systém hlásí klíčové akce, ke kterým dojde, když je fokus klávesnice na prvku. Události myši a tužky spadají do dvou kategorií: události, které oznamují změny v pozici ukazatele vzhledem k elementu, a události, které oznamují změny ve stavu tlačítek zařízení.

Příklad události vstupu z klávesnice

Následující příklad naslouchá stisknutí klávesy šipka vlevo. Vytvoří StackPanel se, který má Button . Obslužná rutina události, která má naslouchat klávesám šipka vlevo, je připojena k Button instanci.

První část příkladu vytvoří StackPanel a a Button připojí obslužnou rutinu události pro 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

Druhá část je zapsána v kódu a definuje obslužnou rutinu události. Když je Stisknutá klávesa šipka vlevo a Button má fokus klávesnice, obslužná rutina se spustí a Background změní se barva Button . Pokud se klávesa stiskne, ale není to klávesa šipka vlevo, barva se Background Button změní zpátky na počáteční barvu.

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

Příklad události vstupu myši

V následujícím příkladu se Background Barva a Button změní, když ukazatel myši vstoupí do Button . BackgroundBarva se obnoví, když myš opustí Button .

První část příkladu vytvoří StackPanel a Button ovládací prvek a připojí obslužné rutiny události pro MouseEnter MouseLeave události a k 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

Druhá část příkladu je zapsána v kódu a definuje obslužné rutiny událostí. Když ukazatel myši vstoupí do Button , Background Barva ovládacího panelu Button se změní na SlateGray . Když myš opustí Button , Background Barva ovládacího panelu Button se změní zpátky na 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

Zadávání textu

TextInputUdálost vám umožní naslouchat textovému zadání způsobem nezávislým na zařízení. Klávesnice je primárním prostředkem textového vstupu, ale řeč, rukopis a jiná vstupní zařízení mohou také vygenerovat textový vstup.

V případě vstupu klávesnice WPF nejprve odešle příslušné KeyDown / KeyUp události. Pokud tyto události nejsou zpracovány a klíč je text (spíše než řídicí klíč, například směrovou šipku nebo funkční klávesy), TextInput je vyvolána událost. Mezi událostmi a není vždy jednoduché mapování 1:1 KeyDown / KeyUp , TextInput protože více klávesových úhozů může generovat jeden znak textového vstupu a jednoho stisknutí kláves, může generovat řetězce s více znaky. To platí zejména pro jazyky, jako jsou čínština, japonština a korejština, které používají editory IME (Input Method editory) k vygenerování tisíců možných znaků v odpovídajících abecedách.

Při WPF odeslání KeyUp / KeyDown události Key je nastavena na hodnotu, pokud se stisknutí kláves Key.System změní na část TextInput události (Pokud je stisknuto ALT + S). To umožňuje kódu v KeyDown obslužné rutině události kontrolovat Key.System a, pokud je nalezeno, opustit zpracování obslužné rutiny následně vyvolané TextInput události. V těchto případech TextCompositionEventArgs lze použít různé vlastnosti argumentu k určení původních klávesových úhozů. Podobně, pokud je aktivní editor IME, Key má hodnotu Key.ImeProcessed a ImeProcessedKey poskytuje původní klávesovou zkratku nebo stisknutí kláves.

Následující příklad definuje obslužnou rutinu Click události a obslužné rutiny KeyDown události.

První segment kódu nebo značek vytvoří uživatelské rozhraní.

<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

Druhý segment kódu obsahuje obslužné rutiny událostí.

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

Vzhledem k tomu, že vstupní události doplní trasu události, StackPanel obdrží vstup bez ohledu na to, který prvek má fokus klávesnice. TextBoxOvládací prvek se nejdřív oznamuje a OnTextInputKeyDown obslužná rutina se volá jenom v případě, že se TextBox vstup nezpracovává. Pokud PreviewKeyDown je namísto události použita událost KeyDown , OnTextInputKeyDown obslužná rutina je volána jako první.

V tomto příkladu je logika zpracování zapsána dvakrát – jednou pro klávesovou zkratku CTRL + O a znovu pro událost Click tlačítka. To se dá zjednodušit pomocí příkazů namísto přímého zpracování událostí vstupu. Příkazy jsou popsány v tomto přehledu a v tématu Přehled příkazů.

Dotykové ovládání a manipulace

Nový hardware a rozhraní API v operačním systému Windows 7 poskytují aplikacím možnost přijímat vstupy z několika dotyků současně. WPF umožňuje aplikacím rozpoznávat a reagovat na dotykové ovládání podobným způsobem jako reakce na jiný vstup, jako je například myš nebo klávesnice, vyvoláním událostí, když dojde k dotyku.

WPF zpřístupňuje dva typy událostí, když dojde k dotyku: události dotyku a události manipulace. Události dotykového ovládání poskytují hrubá data o jednotlivých prstech na dotykové obrazovce a jejich přesun. Události manipulace interpretují vstup jako určité akce. V této části jsou popsány oba typy událostí.

Předpoklady

Pro vývoj aplikací, které reagují na dotykové ovládání, potřebujete tyto komponenty.

  • Visual Studio 2010.

  • Systém Windows 7.

  • Zařízení, jako je dotyková obrazovka, která podporuje dotykové ovládání systému Windows.

Terminologie

Následující výrazy se použijí, když je prodiskutován dotyk.

  • Dotykové ovládání je typ uživatelského vstupu, který je rozpoznáván systémem Windows 7. Dotyková obrazovka se většinou zahajuje tím, že se na dotykové obrazovce přidává prsty. Všimněte si, že zařízení, jako je například touchpad, který je běžný pro přenosné počítače, nepodporují dotykové ovládání, pokud zařízení jednoduše převede polohu a pohyb prstu jako vstup myši.

  • Multitouch je dotykové ovládání, ke kterému dochází z více než jednoho bodu současně. Windows 7 a WPF podporuje multitouch. Pokaždé, když je popsána dotyková dokumentace pro WPF , jsou koncepty uplatněny na multitouch.

  • K manipulaci dojde, když je dotykové ovládání interpretováno jako fyzická akce, která je použita na objekt. V nástroji WPF události manipulace interpretují vstup jako převod, rozšíření nebo manipulaci s rotací.

  • touch devicePředstavuje zařízení, které vytváří dotykové vstupy, jako je například jeden prst na dotykové obrazovce.

Ovládací prvky, které reagují na dotykové ovládání

Následující ovládací prvky lze procházet přetáhnutím prstem přes ovládací prvek, pokud má obsah, který se posouvá mimo zobrazení.

ScrollViewerDefinuje ScrollViewer.PanningMode připojenou vlastnost, která umožňuje určit, zda je povoleno posouvání dotykového ovládání horizontálně, svisle, obojím nebo ani jednou. ScrollViewer.PanningDecelerationVlastnost určuje, jak rychle se posune v případě, že uživatel zaznamená prst z dotykové obrazovky. ScrollViewer.PanningRatioPřipojená vlastnost určuje poměr posunutí posunu, aby bylo možné přeložit posun manipulace.

Události dotykové ovládání

Základní třídy, UIElement , UIElement3D a ContentElement , definují události, které se můžou přihlásit k odběru, takže vaše aplikace bude reagovat na dotykové ovládání. Události dotykové ovládání jsou užitečné v případě, že vaše aplikace interpretuje dotykové ovládání s jinou výjimkou manipulace s objektem. Například aplikace, která umožňuje uživateli kreslit jedním nebo více prsty, by mohla přihlašovat se k odběru událostí dotykové ovládání.

Všechny tři třídy definují následující události, které se chovají podobně bez ohledu na definiční třídu.

Podobně jako události klávesnice a myši jsou události dotykového ovládání směrovány událostmi. Události, které začínají, Preview jsou tunelové události a události, které začínají, Touch jsou probublávání události. Další informace o směrovaných událostech najdete v tématu Přehled směrovaných událostí. Při zpracování těchto událostí lze získat pozici vstupu relativní k libovolnému prvku voláním GetTouchPoint GetIntermediateTouchPoints metody nebo.

Pro pochopení interakce mezi událostmi dotykového ovládání Zvažte situaci, kdy uživatel vloží jeden prst na prvek, přesune prst v prvku a poté vytvoří prst z prvku. Následující ilustrace znázorňuje provádění probubláváních událostí (události tunelování jsou vynechány pro zjednodušení).

Posloupnost událostí dotykového ovládání. Doteková událost

Následující seznam popisuje pořadí událostí na předchozí ilustraci.

  1. K TouchEnter události dojde jednou, když uživatel umístí prst na prvek.

  2. TouchDownUdálost probíhá jednou.

  3. K TouchMove události dochází vícekrát, protože uživatel přesune prst v rámci elementu.

  4. K TouchUp události dochází jednou, když uživatel z elementu zavýtahí prst.

  5. TouchLeaveUdálost probíhá jednou.

Při použití více než dvou prsty dojde k událostem u každého prstu.

Události manipulace

V případech, kdy aplikace umožňuje uživateli manipulovat s objektem, UIElement Třída definuje události manipulace. Na rozdíl od událostí dotyku, které jednoduše hlásí pozici dotyku, se události manipulace vydávají, jak lze interpretovat. Existují tři typy manipulace, překladu, rozšiřování a rotace. Následující seznam popisuje, jak vyvolat tři typy manipulace.

  • Umístěte prst na objekt a pohybujte prstem přes dotykovou obrazovku, aby se vyvolala manipulace s překladem. Tím se obvykle přesune objekt.

  • K vyvolání rozšíření můžete použít dva prsty na objekt a přesunout prsty blíže k sobě nebo více než další. Tím se obvykle změní velikost objektu.

  • Přidejte dva prsty na objekt a otáčejte prsty kolem sebe, aby se vyvolala manipulace s rotací. Tím se obvykle otáčí objekt.

Současně může probíhat více než jeden typ manipulace.

Když způsobíte, že objekty budou reagovat na manipulace, je možné, že se objekt jeví jako nájezdový. Díky tomu mohou vaše objekty simulovat fyzický svět. Když například vložíte knihu do tabulky, pokud budete mít dostatek volného místa, bude kniha po jejím vydání nadále přesunuta. WPF umožňuje simulovat toto chování tím, že vyvolává události manipulace poté, co uživatel uvolňuje objekt.

Informace o tom, jak vytvořit aplikaci, která umožňuje uživateli přesunout, změnit velikost a otočit objekt, najdete v tématu Návod: Vytvoření první aplikace dotykového ovládání.

UIElementDefinuje následující události manipulace.

Ve výchozím nastavení UIElement neobdrží tyto události manipulace. Chcete-li přijímat události manipulace s UIElement , nastavte UIElement.IsManipulationEnabled na true .

Cesta spuštění pro události manipulace

Vezměte v úvahu scénář, kdy uživatel vyvolá objekt. Uživatel vloží prst na objekt, přesune prst na dotykovou obrazovku po krátkou vzdálenost a pak při přesunu zavolá prst. Výsledkem je to, že se objekt přesune v rámci prstu uživatele a nadále se přesune, jakmile uživatel dostane prst.

Následující ilustrace znázorňuje cestu spuštění pro události manipulace a důležité informace o každé události.

Sekvence událostí manipulace. Události manipulace

Následující seznam popisuje pořadí událostí na předchozí ilustraci.

  1. K ManipulationStarting události dojde, když uživatel umístí prst na objekt. Mimo jiné tato událost umožňuje nastavit ManipulationContainer vlastnost. V následných událostech bude poloha manipulace relativní vzhledem k ManipulationContainer . V jiných událostech než je ManipulationStarting Tato vlastnost jen pro čtení, takže ManipulationStarting událost je jediná doba, kterou můžete nastavit v této vlastnosti.

  2. ManipulationStartedDojde k události Next. Tato událost oznamuje původ manipulace.

  3. K ManipulationDelta události dochází víckrát, protože prsty uživatele se přesunou na dotykovou obrazovku. DeltaManipulationVlastnost ManipulationDeltaEventArgs třídy hlásí, zda je manipulace interpretována jako pohyb, rozšíření nebo překlad. To je místo, kde provádíte většinu práce při manipulaci s objektem.

  4. K ManipulationInertiaStarting události dojde, když prsty uživatele ztratí kontakt s objektem. Tato událost umožňuje určit zpomalení manipulace během setrvačné hmotnosti. To znamená, že váš objekt může emulovat různé fyzické prostory nebo atributy, pokud zvolíte. Předpokládejme například, že vaše aplikace má dva objekty, které reprezentují položky ve fyzickém světě, a jeden je těžší než druhý. Nejslabším objektem můžete zvýšit zpomalení rychleji než světlejší objekt.

  5. K ManipulationDelta události dochází vícekrát jako setrvačné hmotnosti. Všimněte si, že tato událost nastane, když se prsty uživatele pohybují v dotykové obrazovce a při WPF simulaci setrvačné hmotnosti. Jinými slovy, ManipulationDelta proběhne před a po ManipulationInertiaStarting události. ManipulationDeltaEventArgs.IsInertialVlastnost hlásí, zda ManipulationDelta událost probíhá během setrvačné hmotnosti, takže můžete tuto vlastnost kontrolovat a provádět různé akce v závislosti na její hodnotě.

  6. K ManipulationCompleted události dojde, když skončí manipulace a jakýkoliv setrvačná hmotnost. To znamená, že po ManipulationDelta výskytu všech událostí ManipulationCompleted dojde k události k signalizaci, že manipulace je dokončena.

UIElementTaké definuje ManipulationBoundaryFeedback událost. Tato událost nastane, pokud ReportBoundaryFeedback je v události volána metoda ManipulationDelta . ManipulationBoundaryFeedbackUdálost umožňuje aplikacím nebo komponentám poskytovat vizuální zpětnou vazbu, když objekt narazí na hranici. Například Window Třída zpracovává ManipulationBoundaryFeedback událost, která způsobí, že okno bude mírně přesunuto, když je jeho okraj zjištěn.

Manipulaci můžete zrušit voláním Cancel metody pro argumenty události v jakékoli události manipulace s výjimkou ManipulationBoundaryFeedback události. Když zavoláte Cancel , události manipulace již nejsou vyvolány a dojde k události myši při dotyku. Následující tabulka popisuje vztah mezi časem zrušení manipulace a událostmi myši, ke kterým dojde.

Událost, která se zruší, se volá v Události myši, které se vyskytují u vstupu, ke kterému již došlo
ManipulationStarting a ManipulationStarted Události myši.
ManipulationDelta Události myši a přesunutí myši.
ManipulationInertiaStarting a ManipulationCompleted Myš dolů, pohyb myši a události myši nahoru

Všimněte si, že pokud zavoláte Cancel , když je manipulace v nenájezdovém umístění, metoda se vrátí false a vstup nevyvolává události myši.

Vztah mezi událostmi dotykového a manipulačního události

UIElementMůže vždy přijímat události dotykového ovládání. Pokud IsManipulationEnabled je vlastnost nastavena na true , UIElement může přijímat dotykové i manipulační události. Pokud TouchDown událost není zpracována (tj. Handled vlastnost je false ), logika manipulace zachytí dotykové ovládání a vygeneruje události manipulace. Pokud Handled je vlastnost nastavena na hodnotu true v TouchDown události, logika manipulace negeneruje události manipulace. Následující ilustrace znázorňuje vztah mezi událostmi dotykového ovládání a událostmi manipulace.

Vztah mezi událostmi dotykového a manipulačního události Události dotyku a manipulace

Následující seznam popisuje vztah mezi událostmi dotykového ovládání a manipulací, které jsou uvedeny na předchozím obrázku.

Zaměření

Existují dva hlavní koncepty, které se týkají fokusu WPF : fokus klávesnice a logický fokus.

Fokus klávesnice

Fokus klávesnice odkazuje na prvek, který přijímá vstup z klávesnice. Na celém počítači může být pouze jeden element, který má fokus klávesnice. V nástroji WPF bude element, který má fokus klávesnice, IsKeyboardFocused nastaven na true . Statická Keyboard Metoda FocusedElement vrátí prvek, který aktuálně má fokus klávesnice.

Fokus klávesnice lze získat pomocí klávesy Tabulátor pro element nebo kliknutím na tlačítko myši u určitých prvků, jako je například TextBox . Fokus klávesnice lze také získat programově pomocí Focus metody Keyboard třídy. Focus pokusy o poskytnutí fokusu klávesnice zadaného elementu. Element vrácený funkcí Focus je prvek, který aktuálně má fokus klávesnice.

Aby element získal fokus klávesnice, Focusable vlastnost a IsVisible vlastnosti musí být nastaveny na hodnotu true. Některé třídy, například Panel , jsou Focusable nastaveny na false výchozí hodnoty; proto může být nutné tuto vlastnost nastavit na true , pokud chcete, aby byl tento prvek schopný získat fokus.

Následující příklad používá Focus k nastavení fokusu klávesnice na Button . Doporučeným místem pro nastavení prvotního zaměření v aplikaci je Loaded obslužná rutina události.

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

Další informace o fokusu klávesnice najdete v tématu Přehled fokusu.

Logický fokus

Logický fokus odkazuje na FocusManager.FocusedElement v oboru fokusu. V aplikaci může být více elementů, které mají logický fokus, ale může existovat pouze jeden prvek, který má logický fokus v rámci konkrétního oboru fokusu.

Rozsah fokusu je prvek kontejneru, který uchovává informace v FocusedElement rámci jeho oboru. Když fokus opustí rozsah fokusu, bude mít fokus na klávesnici fokus, ale zachová se tím logický fokus. Když se fokus vrátí do oboru fokusu, fokus získá fokus klávesnice. To umožňuje změnit fokus klávesnice mezi více rozsahy fokusu, ale zajistěte, aby element fokus v rámci oboru fokusu zůstal při návratu fokusu fokusem elementu.

Element může být převeden do oboru fokusu nastavením XAML (Extensible Application Markup Language) FocusManager připojené vlastnosti IsFocusScope na true nebo v kódu nastavením připojené vlastnosti pomocí SetIsFocusScope metody.

Následující příklad vytvoří StackPanel do oboru fokus nastavením IsFocusScope připojené vlastnosti.

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

Třídy WPF , ve kterých jsou standardně zaměřeny Window na rozsahy, jsou, Menu , ToolBar a ContextMenu .

Element, který má fokus klávesnice, bude mít také logický fokus pro rozsah fokusu, ke kterému patří. Proto je nastavení fokusu u prvku s Focus metodou Keyboard třídy nebo třídami základních prvků proveden pokus o poskytnutí fokusu klávesnice elementu a logického výběru.

Chcete-li určit fokus prvku v oboru fokusu, použijte GetFocusedElement . Chcete-li změnit element s fokusem pro rozsah výběru, použijte SetFocusedElement .

Další informace o logickém výběru najdete v tématu Přehled fokusu.

Pozice myši

WPFVstupní rozhraní API poskytuje užitečné informace, pokud jde o souřadnici prostorů. Například souřadnice (0,0) je levá horní souřadnice, ale v levém horním rohu elementu stromu? Prvek, který je vstupním cílem? Prvek, na který jste připojenou obslužnou rutinu události? Nebo něco jiného? Aby nedocházelo k nejasnostem, WPF Vstupní rozhraní API vyžaduje, abyste při práci s souřadnicemi získanými pomocí myši určili referenční rámec. GetPositionMetoda vrátí souřadnici ukazatele myši relativně k zadanému prvku.

Zachycení myši

Zařízení myši speciálně drží modální charakteristiku, která se označuje jako zachycení myši. K uchování přechodného vstupního stavu, když se spustí operace přetažení, se zachytí myš, aby se nemusely vyskytovat další operace, které se týkají jmenovité pozice ukazatele myši. Během přetahování nemůže uživatel kliknout na bez přerušení přetahování, což způsobí, že většina mouseoverch upozornění není vhodná, zatímco je zachycení myši drženo zdrojem přetažení. Vstupní systém zveřejňuje rozhraní API, která mohou určovat stav zachycení myši, a také rozhraní API, která mohou vynutit zachycení myši na konkrétní prvek nebo Vymazat stav zachycení myši. Další informace o operacích přetažení najdete v tématu Přehledpřetažení.

Příkazy

Příkazy umožňují zpracování vstupu na sémantické úrovni než vstup zařízení. Příkazy jsou jednoduché direktivy, například Cut , Copy , Paste nebo Open . Příkazy jsou užitečné pro centralizaci logiky příkazů. Ke stejnému příkazu může být přistup z Menu , ToolBar nebo prostřednictvím klávesové zkratky. Příkazy také poskytují mechanismus pro vypnutí ovládacích prvků v případě, že příkaz nebude k dispozici.

RoutedCommand je WPF implementací ICommand . Při RoutedCommand spuštění je PreviewExecuted Executed vyvolána událost a a událost v cíli příkazu, která vytvoří tunel a bublinový prvek pomocí stromu elementu, jako je jiný vstup. Pokud není nastaven cíl příkazu, bude element s fokusem klávesnice cílem příkazu. Logika, která provede příkaz, je připojena k CommandBinding . Když Executed událost dosáhne CommandBinding konkrétního příkazu, je ExecutedRoutedEventHandler CommandBinding volána na. Tato obslužná rutina provádí akci příkazu.

Další informace o příkazech najdete v tématu Přehled příkazů.

WPF poskytuje knihovnu běžných příkazů, které se skládají z ApplicationCommands , MediaCommands , ComponentCommands , NavigationCommands a EditingCommands , nebo můžete definovat vlastní.

Následující příklad ukazuje, jak nastavit MenuItem , aby při kliknutí vyvolal Paste příkaz v TextBox , za předpokladu, že TextBox má fokus klávesnice.

<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

Další informace o příkazech v nástroji WPF najdete v tématu Přehled příkazů.

Vstupní systém a základní prvky

Vstupní události, jako jsou připojené události definované Mouse Keyboard třídou, a, Stylus jsou vyvolány vstupním systémem a vloženy do konkrétní pozice v objektovém modelu na základě testu přístupů ve vizuálním stromu v době běhu.

Každá událost, která Mouse ,, Keyboard a Stylus definovaná jako připojená událost je také znovu zpřístupněna základními třídami prvků UIElement a ContentElement jako nová směrovaná událost. Základní element směrované události jsou generovány třídami, které zpracovávají původní připojenou událost a znovu používají data události.

Když je vstupní událost přidružena k určitému zdrojovému elementu prostřednictvím implementace vstupní události základního elementu, může být směrována přes zbytek trasy události, která je založena na kombinaci logických a vizuálních objektů a zpracována kódem aplikace. Obecně je pohodlnější zpracovávat tyto události vstupu související se zařízením pomocí směrovaných událostí na UIElement a ContentElement , protože můžete použít intuitivnější syntaxe obslužné rutiny událostí v XAML a v kódu. Můžete se rozhodnout, že se má zpracovat připojená událost, která iniciovala proces, ale dojde k několika problémům: připojená událost může být označena zpracováním tříd základního elementu a k připojení obslužných rutin pro připojené události potřebujete použít přístupové metody namísto skutečné syntaxe události.

Jak dál?

Nyní máte několik technik pro zpracování vstupu v WPF . Měli byste taky mít lepší přehled o různých typech vstupních událostí a mechanismech směrovanéch událostí, které používá WPF .

K dispozici jsou další prostředky, které vysvětlují WPF prvky architektury a směrování událostí podrobněji. V následujících přehledech najdete další informace, Přehled příkazů, přehled fokusu, Přehled základních prvků, stromy vsubsystému WPF a směrované události.

Viz také