2010-12-01 4 views
12

Ich bin ratlos auf, was sicherlich einer der häufigsten WPF-Anforderungen sein muss. Ich habe this question gelesen, aber meine Implementierung der Lösung funktioniert nicht.Einstellung Fokus auf eine Steuerung innerhalb einer ControlTemplate (Teil 2)

Hier ist das Markup für das lookless Kontrolle:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local="clr-namespace:WpfTest"> 
    <Style TargetType="{x:Type local:CustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type local:CustomControl}"> 
      <Border> 
      <TextBox x:Name="myTextBox" /> 
      </Border> 
      <ControlTemplate.Triggers> 
      <Trigger Property="IsFocused" 
        Value="True"> 
       <Setter Property="FocusManager.FocusedElement" 
         Value="{Binding ElementName=myTextBox}" /> 
       <Setter TargetName="myTextBox" 
         Property="Background" 
         Value="Green" /> 
      </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</ResourceDictionary> 

Hier ist das Markup für das Fenster, die eine Instanz des Custom enthält:

<Window x:Class="WpfTest.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfTest" 
     Title="Window1" Height="300" Width="300"> 

    <local:CustomControl x:Name="CCtl" /> 
</Window> 

Und hier ist der Code-Behind:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     Loaded += (RoutedEventHandler)delegate { CCtl.Focus(); }; 
    } 
} 

Wenn Window1 geladen ist, wird das Textfeld grün (zeigt an, dass die trig Ger funktioniert), aber der Fokus bleibt bei CCtl und nicht bei der Textbox. Ohne Zweifel hat das mit dem Ausgang zu tun, um die folgenden Datenfehler anzeigt:

Cannot find source for binding with reference 'ElementName=myTextBox'. BindingExpression:(no path); DataItem=null; target element is 'CustomControl' (Name='CCtl'); target property is 'FocusedElement' (type 'IInputElement').

Ich habe keine Ahnung, warum dieser Fehler erscheint, wird. Alle Hinweise dankbar erhalten, danke.

Antwort

12

Versuchen Sie dies für Ihre Trigger statt:

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

Der Fehler ist Ihnen zu sagen, dass es nicht myTextBox finden kann, weil der Name nicht im Gültigkeitsbereich ist, wo die FocusedElement Eigenschaft angewendet wird. In diesem Fall handelt es sich um die CCtl-Instanz selbst, die in ihrer eigenen Vorlage nicht angezeigt wird. Durch das Festlegen der Eigenschaft auf etwas innerhalb der Vorlage kann die Bindung das benannte Element finden.

+0

Ja, das ist es - vielen Dank. –

0

Ich kann falsch liegen, aber ich denke, Ihr Problem ist mit Ihrem Eigentum Trigger.

Wenn Sie TextBox auf den Fokus setzen, wird der Wert Trigger auf dem Vorlagen-Elternteil ungültig, sodass der Auslöser abläuft und den Fokus auf die TextBox zurückstellt (daher nicht fokussierend).

+1

Aber sind Sie nicht besorgt über die Fehlermeldung? –

Verwandte Themen