2017-09-14 7 views
0

Je le ControlTemplate suivant:mise au point de réglage WPF pour contrôler le template de contrôle

<ControlTemplate TargetType="dxe:TextEdit" x:Key="TextEditMultiStyle"> 
    <Border x:Name="border" BorderBrush="#054c74" BorderThickness="1" CornerRadius="1"> 
     <Border.Effect> 
      <DropShadowEffect ShadowDepth="0" Color="#0980c2" Opacity="1" BlurRadius="5" /> 
     </Border.Effect> 
     <dxe:TextEdit x:Name="textEdit" TextWrapping="Wrap" AcceptsReturn="True" Text="{TemplateBinding Text}" BorderThickness="0" 
         EditValue="{Binding RelativeSource={RelativeSource TemplatedParent}, 
          Path=EditValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
         VerticalContentAlignment="Top"/> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textEdit}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

J'ai ajouté une zone de texte à ma fenêtre et je désire maintenant mettre l'accent à quand la charge de la fenêtre. Rien n'a fonctionné jusqu'ici et je crois que c'est parce que je dois mettre l'accent sur TextEdit dans mon ControlTemplate. C'est ce que le Trigger est censé faire.

Malheureusement, je ne peux pas déterminer ce que je devrais spécifier comme déclencheur. Le code ci-dessus donne juste une plainte d'exécution:

System.Windows.Data Erreur: 4: Impossible de trouver la source pour la liaison avec la référence 'ElementName = textEdit'. BindingExpression: (pas de chemin); DataItem = null; l'élément cible est 'TextEdit' (Name = 'MarkerTextEdit'); La propriété target est 'FocusedElement' (type 'IInputElement')

Je ne suis également pas convaincu que le déclencheur définirait la propriété sur le bon FocusManager de toute façon car je pense que je dois le définir sur le FocusManager de la fenêtre.

Je pense que je besoin de quelque chose équivalent à:

(code de pseudo) FindAncestor (Fenêtre) .FocusManager.FocusedElement = ControlTemplate.Controls ('textEdit')

Si cela a du sens.

Toutes les suggestions sont les bienvenues car tout ce que je veux faire, c'est que mon TextBox obtienne le focus lorsque la fenêtre se charge. Quelque chose qui est stupidement facile dans WinForms mais semble être la science de fusée dans WPF.

Mise à jour: Je pense que je l'ai confirmé ma théorie que le code-behind suivant fonctionne:

private void MarkerEditorWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     var control = (UIElement)MarkerTextEdit.Template.FindName("textEdit", MarkerTextEdit); 

     control.Focus(); 
    } 

Répondre

0

La solution est de changer le déclencheur:

<Trigger Property="IsFocused" Value="true"> 
      <Setter TargetName="textEdit" Property="FocusManager.FocusedElement" Value="{Binding ElementName=textEdit}"/> 
     </Trigger> 

Fait intéressant cela provoque aussi TextEdit se concentre même si je ne mets rien dans le code XAML ou le code-behind pour le provoquer. Il semble que WPF ait essayé de faire ça tout le temps mais a été contrecarré par mon template.