2010-12-01 21 views
12

Jestem zaskoczony, co z pewnością jest jednym z najbardziej popularnych wymagań WPF. Przeczytałem this question, ale moja implementacja rozwiązania nie działa.Ustawianie ostrości na kontrole w ControlTemplate (część 2)

Oto znaczników do kontroli lookless:

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

Oto narzut na oknie, które zawiera instancję CustomControl:

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

A oto kod z opóźnieniem:

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

Po załadowaniu okna 1 pole tekstowe zmieni kolor na zielony (wskazując, że ger działa), ale fokus pozostaje przy CCtl, a nie w polu tekstowym. Bez wątpienia ma to związek z wyjściem wyświetlającym następujący błąd danych:

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').

Nie mam pojęcia, dlaczego pojawia się ten błąd. Wszelkie wskazówki wdzięczności, dzięki.

Odpowiedz

12

Spróbuj użyć tego do wyzwalacza zamiast:

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

Błąd jest informacją, że nie można zlokalizować myTextBox ponieważ nazwa nie jest w zakresie, w którym nieruchomość jest stosowana focusedElement. W tym przypadku znajduje się on w samej instancji CCtl, która nie może zobaczyć wewnątrz własnego szablonu. Ustawiając właściwość na czymś wewnątrz szablonu, Powiązanie może zlokalizować nazwany element.

+0

Yup, to wszystko - bardzo dziękuję. –

0

Mogę się mylić, ale myślę, że masz problem z wyzwalaczem nieruchomości.

Po ustawieniu ostrości na TextBox, unieważnisz Trigger na Templated Parent, więc wyzwalacz rozwija i odwraca ustawienie fokusu na TextBox (dlatego nie skupia się na nim).

+1

Ale czy nie martwi Cię komunikat o błędzie? –

Powiązane problemy