2010-12-01 11 views
12

No estoy seguro de cuál debe ser seguramente uno de los requisitos más comunes de WPF. He leído this question pero mi implementación de la solución no funciona.Configuración del enfoque en un control dentro de una plantilla de control (Parte 2)

Aquí es el margen de beneficio para el control 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> 

Aquí está el marcado de la ventana que contiene una instancia de la 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> 

Y aquí está el código subyacente:

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

Cuando se carga Window1, el cuadro de texto se vuelve verde (lo que indica que ger funciona) pero el foco permanece con CCtl y no con el cuadro de texto. Sin duda, esto tiene que ver con la salida que muestra el siguiente error de datos:

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

tengo ni idea de por qué este error está apareciendo. Cualquier sugerencia recibida con gratitud, gracias.

Respuesta

12

Intente utilizar esto para su gatillo en su lugar:

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

El error le está diciendo que no puede localizar myTextBox porque el nombre no está en el ámbito donde se aplica la propiedad FocusedElement. En este caso, eso está en la propia instancia CCtl, que no puede ver dentro de su propia plantilla. Al establecer la propiedad en algo dentro de la plantilla, el Enlace puede ubicar el elemento nombrado.

+0

Sí, eso es todo, muchas gracias. –

0

Puedo estar equivocado, pero creo que su problema es con el activador de su propiedad.

Al establecer su TextBox de ser centrado, que de hecho invalida el Trigger en el Padre con plantilla, por lo que el gatillo se desenrolla y se invierte establecer el foco en el cuadro de texto (por lo tanto no-enfocándolo).

+1

¿Pero no le preocupa el mensaje de error? –

Cuestiones relacionadas