2011-02-01 9 views
13

wszystko jest w tytule:co robi x: Key = "{x: Type TextBox}"?

czytałem więcej niż raz, że ustawienie stylu tak:

<Style TargetType="TextBox">...</Style> 

była grubsza odpowiada:

<Style x:Key="{x:Type TextBox}" TargetType="TextBox">...</Style> 

(ostatni raz in a comment on another question)

oba powinny stosować styl do wszystkich pól tekstowych w aplikacji (jeśli oczywiście są one umieszczone w zasobach aplikacji)

ale próbowałem zarówno w moich aplikacjach, jak i tylko w drugim z kluczem zdefiniowanym przez x: Key.

to szwy całkiem logiczne dla mnie, ponieważ pierwszy nie wie, gdzie zastosować bez żadnego x: Zestaw właściwości klucza, ale jaki jest sens pierwszej składni?

Edit: przykład kodu w mojej aplikacji, która działa prawidłowo:

<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="HorizontalContentAlignment" Value="Left"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
</Style> 

i kod, który nie:

<Style TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="HorizontalContentAlignment" Value="Left"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
</Style> 

Napisałem to, aby pozbyć się problemów wiążących ty get with comboBoxItems podczas manipulowania istniejącym itemSource ComboBox. Pierwszy kod działa dobrze, ale drugi nie.

widać to łatwo przez ustawienie horizontalContentAlignment do prawej

Edit 2: Kod ten jest po prostu umieścić w słowniku zasobów w moim App.xaml. I zastąpienie TargetType = "{x: Type ComboBoxItem}" z TargetType = "ComboBoxItem" czyni żadnej różnicy w ogóle

Edit 3: Właśnie uświadomiłem sobie, że mogę zapomnieć do precyzyjnego czegoś ważnego (przepraszam): chociaż style są zdefiniowane w xaml, faktycznie dodałem kontrolki do układu w moim kodzie, ponieważ są dodawane dynamicznie. Może być tam, gdzie leży problem ...

Odpowiedz

9

Jak pokazano w pierwszym przykładzie powyżej, ustawienie właściwości TargetType do TextBlock bez przypisywania stylu literą x: Key pozwala Twój styl będzie stosowane do wszystkich elementów textblock. To, co się dzieje, polega na tym, że w ten sposób niejawnie ustawia klucz x: na {x: Type TextBlock}.Oznacza to również, że jeśli podasz wartość Styl i x: klucz o wartości niż {x: typ Blok tekstowy}, styl nie będzie automatycznie wstawiany do wszystkich elementów TextBlock dla wszystkich elementów TextBlock . Zamiast tego należy wyraźnie zastosować styl do elementów TextBlock .

Biorąc pod uwagę, że jest to from the official documentation, Twój problem musi być anomalią. Widziałem kilka takich dziwactw i nie są one zbyt nieoczekiwane, ponieważ kodowanie za WPF musi być niedoskonałe.

(Czy istnieje różnica w wynikach między TargetType="ComboBoxItem" i TargetType="{x:Type ComboBoxItem}" jeśli klawisz został pominięty?)

+0

Czy możesz rozwinąć, co masz na myśli: * od czasu kodowania być tył WPF musi być niedoskonały. * Czy uważasz, że ten przypadek jest błędem w WPF? Myślę, że zanim dojdziemy do tego wniosku, potrzebujemy dużo więcej kodu. –

+0

"Czy uważasz, że ta sprawa jest błędem w WPF?" Tak, właśnie o to mi chodzi. Nie sądzę, że potrzebujesz więcej kodu, aby dojść do takiego wniosku, ponieważ mamy opis tego, co * powinno * się wydarzyć, i raport, że tak naprawdę nie zawsze tak jest. Podany kod wydaje się dość prosty i jeśli wszystko inne pozostanie całkowicie takie samo, można wywnioskować, że błąd musi być z podstawowym kodem WPF. –

+0

Co to oznacza, można połączyć właściwość TargetType z właściwością x: Type. Wtedy twój styl ComboBoxItem będzie miał zastosowanie tylko wtedy, gdy jawnie zostanie umieszczony w XAML. –

2

Każdy zasób potrzebuje klucza, ale jeśli dla stylu zostanie pominięty element , powinien on domyślnie być ustawiony na typ TargetType. Dlatego oba powyższe fragmenty powinny być równoważne.

Czy możesz umieścić cały kod tam, gdzie nie działa bez wyraźnej definicji Key?

+0

Edytowałem moje pytanie z większą liczbą próbek kodu – David

+0

@David - Gdzie w kodzie jest zdefiniowany ten styl? –

+0

Również w twoim niedziałającym przykładzie, spróbuj zastąpić TargetType = "{x: Wpisz ComboBoxItem} z TargetType =" ComboBoxItem " –

4

Teraz można kaskadowo swoje style dodając:

BasedOn="{StaticResource {x:Type ComboBox}}" 

w < Styl/> dalszego w dół dokumentu, na przykład:

<Window.Resources> 
    <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}"> 
      <Setter Property="HorizontalContentAlignment" Value="Left"/> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
     </Style> 
</Window.Resources> 
<StackPanel> 
    <TextBox>I'm Left-Center</TextBox> 
    <Grid> 
     <Grid.Resources> 
      <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
       <Setter Property="HorizontalContentAlignment" Value="Right"/> 
      </Style> 
     <Grid.Resources> 
     <TextBox>I'm Right-Center</TextBox> 
    </Grid> 
</StackPanel> 
+0

nie znał tej składni, jest interesujący! tak naprawdę nie mówi, co robi x: key = "{x: type xxx}". – David

+0

Twój przykład działa bez klucza x: Key, więc nie ma to znaczenia tutaj – Nicolas