2016-02-21 1 views
8

Ich ging heute durch die Klasse AccessText. Ich konnte die genaue Verwendung und die Ergebnisse der Verwendung dieser Klasse nicht identifizieren.WPF verwendet und erwartete Ergebnisse der AccessText-Klasse

Wenn Sie AccessText mit einem Etikett verwenden und Target Eigenschaft als TextBox, wird die TextBox erhalten konzentrieren, wenn access key pressed.see Code unten ist:

<StackPanel> 
    <Label Target="{Binding ElementName=txtbox}"> 
     <AccessText>_first_second</AccessText> 
    </Label> 
    <TextBox Name="txtbox" Width="100" Height="50"/> 
</StackPanel> 

Wenn Sie AccessText mit einem Label und verwenden Sie Target-Eigenschaft als Buton, die ButtonClick Ereignis wird ausgeführt, wenn access key gedrückt wird.

So sind meine Fragen

1.what das endgültige Verhalten AccessText Klasse ist? Wenn ich voraussagen muss, ist es verwendet mit anderen Arten von Kontrollen wie DataGrid, ComboBox, RadioButton? Wie kann ich mir des erwarteten Ergebnisses sicher sein?

2.Why ist diese Klasse von FrameworkElement abgeleitet? Welche Anwendungen hat es als FrameworkElement? scheint ein wenig mehr für nur spezifizieren Access usw.

Antwort

11

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:

  1. 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.

  2. 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):

enter image description here

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:

enter image description here

Ein Klick oder mit Der Zugriffsschlüssel würde wieder in den ersten Zustand zurückkehren.

+0

@KyloRen, versuchte ich Antwort # 2 ein bisschen mehr auszufüllen. – devuxer

+0

Was muss ein WPF-Entwickler wahrscheinlich in der AccessText-Klasse binden? –

+2

* 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