AccessText
ist ein FrameworkElement
, die mehr oder weniger wie eine spezielle Art von TextBlock
Handlungen, die nach einer einzigen Unterstrich (_
), um als eine beliebige Tastaturzeichen ermöglicht Zugangsschlüssel.
Bei einem bestimmten Steuerelement hängt das Verhalten der zugehörigen Zugriffsschlüssel von der OnAccessKey
-Methode ab. OnAccessKey
ist eine virtuelle Methode von UIElement
, die folgenden Definition lautet:
protected virtual void OnAccessKey(AccessKeyEventArgs e)
{
this.Focus();
}
Also, jede Kontrolle, die nicht die Definition von OnAccessKey
von UIElement
definiert enthebt wird das Standardverhalten beizubehalten, die für die Steuerung zu sein wenn die Zugriffstaste gedrückt wird.
ButtonBase
, die Button
erbt von, für OnAccessKey
folgende Definition hat:
protected override void OnAccessKey(AccessKeyEventArgs e)
{
if (e.IsMultiple)
base.OnAccessKey(e);
else
this.OnClick();
}
das Standardverhalten von Button
und andere Steuerelemente, so dass von ButtonBase
erben wird die Kontrolle in den Fokus zu bringen, wenn IsMultiple
wahr ist Andernfalls wird das Click-Ereignis ausgelöst. (IsMultiple
ist wahr, wenn ein Zugriffsschlüssel mehr als einem UIElement
zugeordnet ist.)
Mit diesem Hintergrund sind hier die Antworten auf Ihre speziellen Fragen:
Die endgültige Verhalten eines AccessText
Element als ContentPresenter
Kontrolle verwendet wird, ist der erste Buchstabe nach einem Unterstrich registrieren Die AccessKeyManager
, die die Methode OnAccessKey
des Steuerelements aufrufen wird, wenn die Taste gedrückt wird. Zu wissen, was dies für ein bestimmtes Steuerelement bedeutet, erfordert zu wissen, welche Definition von OnAccessKey
für dieses Steuerelement gültig ist. Wenn in der Vererbungskette keine Überschreibungen vorhanden sind, wird durch Drücken der Zugriffs-Taste das Steuerelement aktiviert. Wenn es eine Überschreibung gibt, hängt das Verhalten von der Definition der überschreibenden Methode ab. Dies kann durch Experimentieren, Lesen relevanter Dokumentation oder durch Untersuchung des Quellcodes festgestellt werden.
AccessText
ist ein FrameworkElement
aus den gleichen Gründen, die TextBlock
ist ein FrameworkElement
. Es hat eine visuelle Form und nimmt Platz ein, den das Layoutsystem berücksichtigen muss, wenn es andere Elemente relativ zu ihm positioniert. Auch FrameworkElements
ermöglichen Styling, und sie besitzen ihre eigene DataContext
Eigenschaft, die Bindungsszenarien ermöglicht, die sonst nicht möglich wären. Wenn AccessText
keine FrameworkElement
wären, würde dies die WPF-Entwickler unnötig einschränken und vernünftige (wenn auch vielleicht seltene) Anwendungsfälle verhindern.
bearbeiten
Hier ist ein Beispiel für eine Phantasie Power-Taste, die die usefullness AccessText
ist ein FrameworkElement
zeigt:
<Grid>
<Button Width="150"
Height="35"
Command="{Binding PowerCommand}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Status" />
<Rectangle Margin="5,2,0,0"
Width="10"
Height="10"
Fill="{Binding PowerFill}" />
<AccessText Margin="25,0,0,0"
Text="{Binding PowerText}" />
</StackPanel>
</Button>
</Grid>
Daraus ergibt sich (nach dem Drücken Alt):

Nach Klicken der Schaltfläche oder durch Drücken Alt + S würde die Ansicht Modell auf den Befehl reagieren, indem sie die Text
und Fill
ändern, in dieser resultierenden:

Ein Klick oder mit Der Zugriffsschlüssel würde wieder in den ersten Zustand zurückkehren.
@KyloRen, versuchte ich Antwort # 2 ein bisschen mehr auszufüllen. – devuxer
Was muss ein WPF-Entwickler wahrscheinlich in der AccessText-Klasse binden? –
* Was muss ein WPF-Entwickler wahrscheinlich in der AccessText-Klasse binden? * Definitiv die Eigenschaft 'Text' und möglicherweise Dinge wie' Rand', 'Vordergrund',' FontWeight' und 'FontStyle'. * Ich weiß, dass ich ein Layout für eine Zugriffstextklasse erstellen kann, aber das wird immer eine Notwendigkeit sein? * Ich füge ein Beispiel hinzu. Ich habe gehört, dass ein spezielles "FrameworkElement" nur für diesen Zweck eine seltsame Design-Wahl war. Ich bin nicht sicher, warum sie 'TextBlock' nicht einfach eine 'RecognizesAccessKey'-Eigenschaft hinzugefügt haben und sie einen Tag nennen. – devuxer