2010-12-01 32 views
12

Kesinlikle en yaygın WPF gereksinimlerinden biri olması gerekenler konusunda şaşırıyorum. Ben this question okudum ama çözüm benim uygulama çalışmıyor. İşte ControlTemplate İçinde Kontrol Üzerine Odaklama Ayarı (Bölüm 2)

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

CustomControl bir örneğini içeren Pencere için biçimlendirme var: Burada

lookless kontrolü için biçimlendirme var burada

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

Ve kod arkasında:

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

Window1 yüklendiğinde, metin kutusu yeşile döner. ger çalışır) ancak odak metin kutusu değil, CCtl ile kalır. Kuşkusuz bu Aşağıdaki veri hatasını gösteren çıkışı ile ilgisi var:

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

ben bu hata göründüğünü neden hiçbir fikrim yok. Teşekkürler minnetle alınan herhangi bir işaretçi.

cevap

12

yerine Tetikleyici için bu kullanmayı deneyin:

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

hata FocusedElement özelliği uygulandığı yerlerde adı kapsamında olmadığı için MyTextBox bulamaz olduğunu anlatıyor. Bu durumda, kendi şablonu içinde göremeyen CCtl örneğinin kendisi var. Özelliğin şablon içindeki bir şey üzerine ayarlanmasıyla Bağlama, adlandırılan öğeyi bulabilir.

+0

Yup, işte bu - gerçekten çok teşekkürler. –

0

Yanılıyor olabilirim, ama sorununun mülkünüzün tetikleyicisi olduğunu düşünüyorum. Tetik açmak sureti ile (dolayısıyla onu un-odaklanan) TextBox netlik ayarı tersine çevirir böylece senin TextBox odaklanmış olmanın, sen aslında, Templated Ana Ortaklık Trigger geçersiz ayarlayarak

.

+1

Ancak hata mesajıyla ilgili endişeleriniz yok mu? –