2017-09-14 7 views
0

Ich habe folgendes Control:WPF Einstellung Fokus zu steuern, in der Steuervorlage

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

ich einen Text zu meinem Fenster hinzugefügt haben und nun den Fokus auf es, wenn die Fenster Lasten einstellen möchten. Bisher hat noch nichts funktioniert und ich glaube, dass ich mich auf den TextEdit in meinem ControlTemplate konzentrieren muss. Genau das soll der Trigger tun.

Leider kann ich nicht herausfinden, was ich als Auslöser angeben sollte. Der obige Code gibt nur eine Laufzeitbeschwerde:

System.Windows.Data Fehler: 4: Die Quelle für die Bindung mit Verweis 'ElementName = TextEdit' kann nicht gefunden werden. BindingExpression: (kein Pfad); Datenelement = null; Zielelement ist 'TextEdit' (Name = 'MarkerTextEdit'); target -Eigenschaft ist 'FocusedElement' (Typ 'IInputElement')

Ich bin auch nicht davon überzeugt, dass der Trigger würde die Eigenschaft auf den richtigen FocusManager trotzdem festlegen, wie ich denke, ich muss es auf den FocusManager des Windows einstellen.

Also ich denke, ich brauche etwas, das entspricht:

(Pseudocode) FindAncestor (Fenster) .FocusManager.FocusedElement = ControlTemplate.Controls ('textEdit')

Wenn das macht keinen Sinn.

Alle Vorschläge sind willkommen, weil alles, was ich tun möchte, hat meine TextBox bekommen den Fokus, wenn das Fenster lädt. Etwas, das in WinForms blödsinnig ist, aber in WPF anscheinend Raketenwissenschaft ist.

Update: Ich glaube, ich habe meine Theorie wie der Code-behind arbeitet folgende bestätigt:

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

     control.Focus(); 
    } 

Antwort

0

Die Lösung ist, den Auslöser zu ändern: Diese

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

Interessanter auch die Ursachen TextEdit soll fokussiert sein, auch wenn ich nichts in den XAML oder Code-Behind lege, um es zu verursachen. Es sieht so aus, als ob WPF das schon immer versucht hat, aber von meinem Template vereitelt wurde.