2009-09-15 8 views
2

Dans WPF, vous pouvez affecter un libellé à un mnémonique et lui indiquer le contrôle à activer avec la propriété "Cible".WPF: Rendre la propriété Target référence à un contrôle dans WindowsFormsHost

Cela ne fonctionne pas si la cible est un WindowsFormsHost. Y a-t-il une solution connue à cela?

Voici un exemple. J'essaye de faire ALT-S activer la zone de texte masquée.

<Label 
    Width="Auto" 
    Target="{Binding ElementName=tbStartTime}" 
    TabIndex="12"> 
    _Start Time: 
</Label> 
<WindowsFormsHost 
    Name="tbStartTime" 
    TabIndex="13"> 
<wf:MaskedTextBox Name="wfStartTime" Mask="90:00" /> 
/WindowsFormsHost> 

Répondre

2

Je ne pense pas qu'il est possible, au moins pas sans code supplémentaire ... boilerplate WPF et Windows Forms ont un modèle complètement différent, et la propriété Target ne sont pas conçus pour se référer à des contrôles WinForms. Au lieu de cela, je pense que vous devriez utiliser une implémentation WPF de MaskedTextBox, comme this one (vous pouvez trouver beaucoup d'autres exemples avec Google). Utiliser les contrôles WinForms dans une application WPF est rarement une bonne idée si vous pouvez l'éviter ...

EDIT: Je viens de vérifier le doc: il n'est certainement pas possible de faire ce que vous voulez, car le type de la propriété Label.Target est UIElement, et les contrôles WinForms ne sont manifestement pas UIElement s ...


MISE à JOUR: OK, j'ai mal lu votre code ... vous faites référence à la WindowsFormsHost, qui est un UIElement. Qui a voté pour moi était faux aussi ;-)

Je pense que le problème est que le WindowsFormsHost prend la mise au point lorsque vous appuyez sur Alt-S, pas le MaskedTextBox. Voici une solution rapide:

XAML:

<WindowsFormsHost 
    Name="tbStartTime" 
    TabIndex="13" 
    GotFocus="tbStartTime_GotFocus"> 
<wf:MaskedTextBox Name="wfStartTime" Mask="90:00" /> 
</WindowsFormsHost> 

code-behind:

private void tbStartTime_GotFocus(object sender, RoutedEventArgs e) 
    { 
     tbStartTime.Child.Focus(); 
    } 

Quoi qu'il en soit, mon conseil précédent est toujours pertinent: vous feriez mieux d'utiliser un WPF MaskedTextBox ...

+0

Cela doit être une erreur de l'équipe WPF. C'est une chose si évidente - si vous vous concentrez sur un WindowsFormsHost, quoi d'autre devrait se produire, à part que le contrôle enfant devienne ciblé? Pourtant, je suis content qu'il existe une solution de contournement d'une ligne. –

+1

IMO, une solution de contournement vraiment propre n'impliquerait pas l'écriture de code derrière ... celui-ci pourrait facilement être enveloppé dans une propriété attachée réutilisable –

Questions connexes