Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Veel apps bevatten verzamelingen inhoud in de vorm van lijsten, rasters en bomen die gebruikers kunnen bewerken. Gebruikers kunnen bijvoorbeeld items verwijderen, een andere naam geven, markeren of vernieuwen. In dit artikel leest u hoe u contextuele opdrachten kunt gebruiken om dit soort acties te implementeren op een manier die de best mogelijke ervaring biedt voor alle invoertypen.
Belangrijke API's: interface ICommand, UIElement.ContextFlyout-eigenschap, INotifyPropertyChanged-interface
Opdrachten maken voor alle invoertypen
Omdat gebruikers met een Windows-app kunnen communiceren via een breed scala aan apparaten en invoer, moet uw app opdrachten beschikbaar stellen middels zowel invoeragnostische contextmenu's als invoerspecifieke snelkoppelingen. Als u beide optelt, kan de gebruiker snel opdrachten op inhoud aanroepen, ongeacht het invoer- of apparaattype.
In deze tabel ziet u enkele typische verzamelingsopdrachten en manieren om deze opdrachten beschikbaar te maken.
| Command | Invoeronafhankelijk | Muisversneller | Toetsenbordversneller | Aanraakversneller |
|---|---|---|---|---|
| Item verwijderen | Contextmenu | Zweefknop | DEL-sleutel | Swipe om te verwijderen |
| Vlagitem | Contextmenu | Zweefknop | Ctrl+Shift+G | Swipe om te markeren |
| Gegevens vernieuwen | Contextmenu | N/A | F5-toets | Naar beneden trekken om te vernieuwen |
| Een item favoriet maken | Contextmenu | Zweefknop | F, Ctrl+S | Swipe naar favoriet |
Over het algemeen moet u alle opdrachten voor een item beschikbaar maken in het contextmenu van het item. Contextmenu's zijn toegankelijk voor gebruikers, ongeacht het invoertype en moeten alle contextuele opdrachten bevatten die de gebruiker kan uitvoeren.
Voor veelgebruikte opdrachten kunt u overwegen invoerversnellers te gebruiken. Met invoerversnellers kan de gebruiker snel acties uitvoeren op basis van hun invoerapparaat. Invoerversnellers zijn onder andere:
- Veeg-naar-actie (aanraakversneller)
- Ophalen om gegevens te vernieuwen (aanraakversneller)
- Sneltoetsen (toetsenbordversnellers)
- Toegangstoetsen (sneltoetsen)
- Muis & pen zweefknoppen (aanwijzerversneller)
Opmerking
Gebruikers moeten toegang hebben tot alle opdrachten vanaf elk type apparaat. Bijvoorbeeld, als de opdrachten van uw app alleen toegankelijk zijn via hover-aanwijsknopversnellers, kunnen aanraakgebruikers geen toegang krijgen tot deze opdrachten. Gebruik minimaal een contextmenu om toegang te bieden tot alle opdrachten.
Voorbeeld: Het gegevensmodel PodcastObject
Om onze indrukwekkende aanbevelingen te demonstreren, maakt dit artikel een lijst met podcasts voor een podcast-app. De voorbeeldcode laat zien hoe de gebruiker een bepaalde podcast 'favoriet' kan maken uit een lijst.
Hier volgt de definitie voor het podcastobject waarmee we gaan werken:
public class PodcastObject : INotifyPropertyChanged
{
// The title of the podcast
public String Title { get; set; }
// The podcast's description
public String Description { get; set; }
// Describes if the user has set this podcast as a favorite
public bool IsFavorite
{
get
{
return _isFavorite;
}
set
{
_isFavorite = value;
OnPropertyChanged("IsFavorite");
}
}
private bool _isFavorite = false;
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(String property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
}
U ziet dat het PodcastObject INotifyPropertyChanged implementeert om te reageren op eigenschapswijzigingen wanneer de gebruiker de eigenschap IsFavorite in- of uitwisselt.
Opdrachten definiëren met de ICommand-interface
Met de interface ICommand kunt u een opdracht definiëren die beschikbaar is voor meerdere invoertypen. In plaats van bijvoorbeeld dezelfde code te schrijven voor een verwijderopdracht in twee verschillende gebeurtenis-handlers, één voor wanneer de gebruiker op de Delete-toets drukt en één voor wanneer de gebruiker met de rechtermuisknop op Verwijderen klikt in een snelmenu, kunt u uw verwijderlogica eenmaal implementeren, als een ICommand en deze vervolgens beschikbaar maken voor verschillende invoertypen.
We moeten de ICommand definiëren die de actie Favoriet vertegenwoordigt. We gebruiken de execute-methode van de opdracht om een podcast als favoriet te markeren. De specifieke podcast wordt verstrekt aan de uitvoermethode via de parameter van de opdracht, die kan worden gebonden met behulp van de eigenschap CommandParameter.
public class FavoriteCommand: ICommand
{
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
// Perform the logic to "favorite" an item.
(parameter as PodcastObject).IsFavorite = true;
}
}
Als u dezelfde opdracht wilt gebruiken met meerdere verzamelingen en elementen, kunt u de opdracht opslaan als een resource op de pagina of in de app.
<Application.Resources>
<local:FavoriteCommand x:Key="favoriteCommand" />
</Application.Resources>
Als u de opdracht wilt uitvoeren, roept u de execute-methode aan.
// Favorite the item using the defined command
var favoriteCommand = Application.Current.Resources["favoriteCommand"] as ICommand;
favoriteCommand.Execute(PodcastObject);
Een UserControl maken om te reageren op verschillende invoer
Wanneer u een lijst met items hebt en elk van deze items op meerdere invoer moet reageren, kunt u uw code vereenvoudigen door een UserControl voor het item te definiëren en deze te gebruiken om het contextmenu en gebeurtenis-handlers van uw items te definiëren.
Een UserControl maken in Visual Studio:
- Klik in Solution Explorer met de rechtermuisknop op het project. Er wordt een contextmenu weergegeven.
- Selecteer Nieuw item toevoegen > ...
Het dialoogvenster Nieuw item toevoegen wordt weergegeven. - Selecteer UserControl in de lijst met items. Geef deze de gewenste naam en klik op Toevoegen. Visual Studio genereert een stub UserControl voor u.
In ons podcastvoorbeeld wordt elke podcast weergegeven in een lijst, waarmee verschillende manieren worden weergegeven om een podcast te 'favoriet' te maken. De gebruiker kan de volgende acties uitvoeren om de podcast als favoriet te markeren:
- Een contextmenu aanroepen
- Sneltoetsen uitvoeren
- Een zweefknop weergeven
- Een veegbeweging uitvoeren
Als u dit gedrag wilt inkapselen en de FavoriteCommand wilt gebruiken, maken we een nieuwe UserControl met de naam PodcastUserControl om een podcast in de lijst weer te geven.
PodcastUserControl geeft de velden van het PodcastObject weer als TextBlocks en reageert op verschillende gebruikersinteracties. In dit artikel wordt verwezen naar en uitgebreid ingegaan op de PodcastUserControl.
PodcastUserControl.xaml
<UserControl
x:Class="ContextCommanding.PodcastUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
IsTabStop="True" UseSystemFocusVisuals="True"
>
<Grid Margin="12,0,12,0">
<StackPanel>
<TextBlock Text="{x:Bind PodcastObject.Title, Mode=OneWay}" Style="{StaticResource TitleTextBlockStyle}" />
<TextBlock Text="{x:Bind PodcastObject.Description, Mode=OneWay}" Style="{StaticResource SubtitleTextBlockStyle}" />
<TextBlock Text="{x:Bind PodcastObject.IsFavorite, Mode=OneWay}" Style="{StaticResource SubtitleTextBlockStyle}"/>
</StackPanel>
</Grid>
</UserControl>
PodcastUserControl.xaml.cs
public sealed partial class PodcastUserControl : UserControl
{
public static readonly DependencyProperty PodcastObjectProperty =
DependencyProperty.Register(
"PodcastObject",
typeof(PodcastObject),
typeof(PodcastUserControl),
new PropertyMetadata(null));
public PodcastObject PodcastObject
{
get { return (PodcastObject)GetValue(PodcastObjectProperty); }
set { SetValue(PodcastObjectProperty, value); }
}
public PodcastUserControl()
{
this.InitializeComponent();
// TODO: We will add event handlers here.
}
}
U ziet dat PodcastUserControl een verwijzing naar het PodcastObject onderhoudt als een DependencyProperty. Hierdoor kunnen we PodcastObjects binden aan de PodcastUserControl.
Nadat u enkele PodcastObjects hebt gegenereerd, kunt u een lijst met podcasts maken door de PodcastObjects te binden aan een ListView. De PodcastUserControl-objecten beschrijven de visualisatie van de PodcastObjects en worden daarom ingesteld met de ItemTemplate van ListView.
MainPage.xaml
<ListView x:Name="ListOfPodcasts"
ItemsSource="{x:Bind podcasts}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:PodcastObject">
<local:PodcastUserControl PodcastObject="{x:Bind Mode=OneWay}" />
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<!-- The PodcastUserControl will entirely fill the ListView item and handle tabbing within itself. -->
<Style TargetType="ListViewItem" BasedOn="{StaticResource ListViewItemRevealStyle}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Padding" Value="0"/>
<Setter Property="IsTabStop" Value="False"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
Contextmenu's maken
Contextmenu's geven een lijst met opdrachten of opties weer wanneer de gebruiker deze aanvraagt. Contextmenu's bieden contextuele opdrachten met betrekking tot het gekoppelde element en zijn over het algemeen gereserveerd voor secundaire acties die specifiek zijn voor dat item.
De gebruiker kan contextmenu's aanroepen met behulp van deze 'contextacties':
| Invoer | Contextactie |
|---|---|
| Mouse | Klik met de rechtermuisknop |
| Keyboard | Shift+F10, Menuknop |
| Touch | Lang op item drukken |
| Pen | Druk op de zijdrukknop, houd lang ingedrukt op een object. |
| Gamepad | Menuknop |
Omdat de gebruiker een contextmenu kan openen, ongeacht het invoertype, moet het contextmenu alle contextuele opdrachten bevatten die beschikbaar zijn voor het lijstitem.
ContextFlyout
Met de eigenschap ContextFlyout, gedefinieerd door de uiElement-klasse, kunt u eenvoudig een contextmenu maken dat werkt met alle invoertypen. U geeft een flyout op die uw contextmenu weergeeft met menuFlyout of CommandBarFlyout en wanneer de gebruiker een contextactie uitvoert zoals hierboven is gedefinieerd, wordt de MenuFlyout of CommandBarFlyout die overeenkomt met het item weergegeven.
Zie menu's en contextmenu's voor hulp bij het identificeren van menu's versus contextmenuscenario's en richtlijnen voor het gebruik van flyout van menu's versus flyout op de opdrachtbalk.
In dit voorbeeld gebruiken we MenuFlyout en beginnen we met het toevoegen van een ContextFlyout aan PodcastUserControl. De MenuFlyout die is opgegeven als contextFlyout bevat één item om een podcast als favoriet te markeren. U ziet dat deze MenuFlyoutItem gebruikmaakt van de hierboven gedefinieerde favoriteCommand, waarbij commandParameter is gebonden aan het PodcastObject.
PodcastUserControl.xaml
<UserControl>
<UserControl.ContextFlyout>
<MenuFlyout>
<MenuFlyoutItem Text="Favorite" Command="{StaticResource favoriteCommand}" CommandParameter="{x:Bind PodcastObject, Mode=OneWay}" />
</MenuFlyout>
</UserControl.ContextFlyout>
<Grid Margin="12,0,12,0">
<!-- ... -->
</Grid>
</UserControl>
U kunt ook de ContextRequested-gebeurtenis gebruiken om te reageren op contextacties. De gebeurtenis ContextRequested wordt niet geactiveerd als er een ContextFlyout is opgegeven.
Invoerversnellers maken
Hoewel elk item in de verzameling een contextmenu moet hebben met alle contextuele opdrachten, kunt u gebruikers in staat stellen om snel een kleinere set veelgebruikte opdrachten uit te voeren. Een mailing-app kan bijvoorbeeld secundaire opdrachten hebben, zoals Beantwoorden, Archiveren, Verplaatsen naar map, Vlag instellen en Verwijderen, die worden weergegeven in een contextmenu, maar de meest voorkomende opdrachten zijn Verwijderen en Vlag. Nadat u hebt vastgesteld welke opdrachten het meest worden gebruikt, kunt u op invoer gebaseerde accelerators gebruiken om deze opdrachten gemakkelijker uit te voeren voor een gebruiker.
In de podcast-app is de vaak uitgevoerde opdracht de opdracht Favoriet.
Toetsenbordversnellers
Sneltoetsen en directe sleutelafhandeling
Afhankelijk van het type inhoud kunt u bepaalde toetsencombinaties identificeren die een actie moeten uitvoeren. In een e-mail-app kan bijvoorbeeld de DEL-sleutel worden gebruikt om de geselecteerde e-mail te verwijderen. In een podcast-app kunnen de Ctrl+S- of F-toetsen een podcast favoriet maken voor later gebruik. Hoewel sommige opdrachten algemene, bekende sneltoetsen zoals DEL hebben om te verwijderen, hebben andere opdrachten app- of domeinspecifieke sneltoetsen. Gebruik indien mogelijk bekende sneltoetsen of overweeg om herinneringstekst op te geven in knopinfo om de gebruiker te leren over de snelkoppelingsopdracht.
Uw app kan reageren wanneer de gebruiker op een toets drukt met behulp van de KeyDown-gebeurtenis . Over het algemeen verwachten gebruikers dat de app reageert wanneer ze eerst op de toets drukken in plaats van te wachten totdat ze de sleutel loslaten.
In dit voorbeeld wordt uitgelegd hoe u de KeyDown-handler toevoegt aan de PodcastUserControl om een podcast aan uw favorieten toe te voegen wanneer de gebruiker op Ctrl+S of F drukt. Hierbij wordt dezelfde opdracht gebruikt als voorheen.
PodcastUserControl.xaml.cs
// Respond to the F and Ctrl+S keys to favorite the focused item.
protected override void OnKeyDown(KeyRoutedEventArgs e)
{
var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control);
var isCtrlPressed = (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down || (ctrlState & CoreVirtualKeyStates.Locked) == CoreVirtualKeyStates.Locked;
if (e.Key == Windows.System.VirtualKey.F || (e.Key == Windows.System.VirtualKey.S && isCtrlPressed))
{
// Favorite the item using the defined command
var favoriteCommand = Application.Current.Resources["favoriteCommand"] as ICommand;
favoriteCommand.Execute(PodcastObject);
}
}
Muisversnellers
Gebruikers zijn bekend met contextmenu's met de rechtermuisknop, maar u kunt gebruikers in staat stellen algemene opdrachten uit te voeren met slechts één klik met de muis. Als u deze ervaring wilt mogelijk maken, kunt u speciale knoppen toevoegen aan het canvas van uw verzamelingsitem. Om gebruikers in staat te stellen snel te handelen met behulp van de muis en om visuele rommel te minimaliseren, kunt u ervoor kiezen om deze knoppen alleen weer te geven wanneer de gebruiker de muisaanwijzer binnen een bepaald lijstitem heeft.
In dit voorbeeld wordt de opdracht Favorieten vertegenwoordigd door een knop die rechtstreeks in PodcastUserControl is gedefinieerd. Houd er rekening mee dat voor de knop in dit voorbeeld dezelfde opdracht, FavoriteCommand, wordt gebruikt als voorheen. Als u de zichtbaarheid van deze knop wilt in-/uitschakelen, kunt u visualStateManager gebruiken om te schakelen tussen visuele statussen wanneer de aanwijzer het besturingselement binnenkomt en verlaat.
PodcastUserControl.xaml
<UserControl>
<UserControl.ContextFlyout>
<!-- ... -->
</UserControl.ContextFlyout>
<Grid Margin="12,0,12,0">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="HoveringStates">
<VisualState x:Name="HoverButtonsShown">
<VisualState.Setters>
<Setter Target="hoverArea.Visibility" Value="Visible" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="HoverButtonsHidden" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="{x:Bind PodcastObject.Title, Mode=OneWay}" Style="{StaticResource TitleTextBlockStyle}" />
<TextBlock Text="{x:Bind PodcastObject.Description, Mode=OneWay}" Style="{StaticResource SubtitleTextBlockStyle}" />
<TextBlock Text="{x:Bind PodcastObject.IsFavorite, Mode=OneWay}" Style="{StaticResource SubtitleTextBlockStyle}"/>
</StackPanel>
<Grid Grid.Column="1" x:Name="hoverArea" Visibility="Collapsed" VerticalAlignment="Stretch">
<AppBarButton Icon="OutlineStar" Label="Favorite" Command="{StaticResource favoriteCommand}" CommandParameter="{x:Bind PodcastObject, Mode=OneWay}" IsTabStop="False" VerticalAlignment="Stretch" />
</Grid>
</Grid>
</UserControl>
Zweefknoppen moeten verschijnen en verdwijnen wanneer de muis het item binnenkomt en verlaat. Als u wilt reageren op muisgebeurtenissen, kunt u de gebeurtenissen PointerEntered en PointerExited gebruiken op PodcastUserControl.
PodcastUserControl.xaml.cs
protected override void OnPointerEntered(PointerRoutedEventArgs e)
{
base.OnPointerEntered(e);
// Only show hover buttons when the user is using mouse or pen.
if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse || e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Pen)
{
VisualStateManager.GoToState(this, "HoverButtonsShown", true);
}
}
protected override void OnPointerExited(PointerRoutedEventArgs e)
{
base.OnPointerExited(e);
VisualStateManager.GoToState(this, "HoverButtonsHidden", true);
}
De knoppen die in de muisaanwijzerstatus worden weergegeven, zijn alleen toegankelijk via het invoertype aanwijzer. Omdat deze knoppen beperkt zijn tot invoer van aanwijzers, kunt u ervoor kiezen om de opvulling rond het pictogram van de knop te minimaliseren of te verwijderen om te optimaliseren voor aanwijzerinvoer. Als u ervoor kiest om dit te doen, moet u ervoor zorgen dat de footprint van de knop ten minste 20x20px is om bruikbaar te blijven met pen en muis.
Aanraakversnellers
Swipe
Swipe-opdrachten is een aanraakversneller waarmee gebruikers op aanraakapparaten algemene secundaire acties kunnen uitvoeren met aanraking. Met Swipe kunnen gebruikers snel en op natuurlijke wijze communiceren met inhoud, met behulp van algemene acties zoals Swipe-to-Delete of Swipe-to-Invoke. Zie het artikel over swipe-opdrachten voor meer informatie.
Als u swipe in uw verzameling wilt integreren, hebt u twee onderdelen nodig: SwipeItems, die als host fungeert voor de opdrachten; en een SwipeControl, waarmee het item wordt verpakt en swipe-interactie mogelijk is.
SwipeItems kunnen worden gedefinieerd als een resource in podcastuserControl. In dit voorbeeld bevat SwipeItems een opdracht om een item aan uw favorieten toe te voegen.
<UserControl.Resources>
<SymbolIconSource x:Key="FavoriteIcon" Symbol="Favorite"/>
<SwipeItems x:Key="RevealOtherCommands" Mode="Reveal">
<SwipeItem IconSource="{StaticResource FavoriteIcon}" Text="Favorite" Background="Yellow" Invoked="SwipeItem_Invoked"/>
</SwipeItems>
</UserControl.Resources>
Met SwipeControl wordt het item verpakt en kan de gebruiker ermee werken met behulp van de veegbeweging. Merk op dat de SwipeControl een verwijzing naar de SwipeItems bevat als RightItems. Het favoriete item wordt weergegeven wanneer de gebruiker van rechts naar links swipet.
<SwipeControl x:Name="swipeContainer" RightItems="{StaticResource RevealOtherCommands}">
<!-- The visual state groups moved from the Grid to the SwipeControl, since the SwipeControl wraps the Grid. -->
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="HoveringStates">
<VisualState x:Name="HoverButtonsShown">
<VisualState.Setters>
<Setter Target="hoverArea.Visibility" Value="Visible" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="HoverButtonsHidden" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid Margin="12,0,12,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackPanel>
<TextBlock Text="{x:Bind PodcastObject.Title, Mode=OneWay}" Style="{StaticResource TitleTextBlockStyle}" />
<TextBlock Text="{x:Bind PodcastObject.Description, Mode=OneWay}" Style="{StaticResource SubtitleTextBlockStyle}" />
<TextBlock Text="{x:Bind PodcastObject.IsFavorite, Mode=OneWay}" Style="{StaticResource SubtitleTextBlockStyle}"/>
</StackPanel>
<Grid Grid.Column="1" x:Name="hoverArea" Visibility="Collapsed" VerticalAlignment="Stretch">
<AppBarButton Icon="OutlineStar" Command="{StaticResource favoriteCommand}" CommandParameter="{x:Bind PodcastObject, Mode=OneWay}" IsTabStop="False" LabelPosition="Collapsed" VerticalAlignment="Stretch" />
</Grid>
</Grid>
</SwipeControl>
Wanneer de gebruiker swipet om de opdracht Favoriet aan te roepen, wordt de aangeroepen methode aangeroepen.
private void SwipeItem_Invoked(SwipeItem sender, SwipeItemInvokedEventArgs args)
{
// Favorite the item using the defined command
var favoriteCommand = Application.Current.Resources["favoriteCommand"] as ICommand;
favoriteCommand.Execute(PodcastObject);
}
Naar beneden trekken om te vernieuwen
Met Trekken om te vernieuwen kan een gebruiker een verzameling gegevens omlaag trekken met behulp van aanraking om meer gegevens te vernieuwen. Zie het artikel 'pull to refresh' voor meer informatie.
Penversnellers
Het invoertype pen biedt de precisie van aanwijzerinvoer. Gebruikers kunnen algemene acties uitvoeren, zoals het openen van contextmenu's met behulp van penversnellers. Als u een contextmenu wilt openen, kunnen gebruikers op het scherm tikken met de vatknop ingedrukt of lang op de inhoud drukken. Gebruikers kunnen de pen ook gebruiken om de muisaanwijzer over inhoud te bewegen om meer inzicht te krijgen in de gebruikersinterface, zoals het weergeven van knopinfo, of om secundaire aanwijsacties weer te geven, vergelijkbaar met de muis.
Zie het artikel over pen- en stylusinteractie om uw app te optimaliseren voor peninvoer.
Aanbevelingen
- Zorg ervoor dat gebruikers toegang hebben tot alle opdrachten vanaf alle typen Windows-apparaten.
- Neem een contextmenu op dat toegang biedt tot alle opdrachten die beschikbaar zijn voor een verzamelingsitem.
- Geef invoerversnellers op voor veelgebruikte opdrachten.
- Gebruik de interface ICommand om opdrachten te implementeren.
Verwante onderwerpen
Windows developer