2011-01-27 15 views
23

Mam proste okno WPF, które ma 12 przycisków na nim. Chcę, aby ten sam styl był stosowany do nich wszystkich. Ten kod powoduje ten sam błąd:WPF nie stosuje stylu do pierwszego elementu

<Window x:Class="TestApp.TestWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="TestWindow" Height="400" Width="500" 
     WindowStyle="None" WindowState="Maximized"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Resources/AllResources.xaml"/> 
       <ResourceDictionary> 
        <Style TargetType="{x:Type Button}"> 
         <Setter Property="FontSize" Value="100"/> 
        </Style> 
       </ResourceDictionary> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Button Grid.Column="0" Content="1" Name="Button1"/> 
     <Button Grid.Column="1" Content="2" Name="Button2"/> 
    </Grid> 
</Window> 

Pierwszy przycisk nie powoduje zastosowania stylu, ale drugi robi. I could ustawić klucz i używać go na każdym przycisku, ale wolałbym, aby WPF obsługiwać to dla mnie. Właśnie dowiedziałem się, pisząc to, że gdy nie uwzględniam zewnętrznego ResourceDictionary, działa zgodnie z oczekiwaniami. Będzie to problemem w przyszłości, ponieważ moja aplikacja rozszerzy się, ponieważ mam wiele okien, które muszą współdzielić te same zasoby. Zmodyfikowany kod wygląda następująco:

<Window x:Class="TestApp.TestWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="TestWindow" Height="400" Width="500" 
     WindowStyle="None" WindowState="Maximized"> 
    <Window.Resources> 
     <Style TargetType="{x:Type Button}"> 
      <Setter Property="FontSize" Value="100"/> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Button Grid.Column="0" Content="1" Name="Button1"/> 
     <Button Grid.Column="1" Content="2" Name="Button2"/> 
    </Grid> 
</Window> 

Działa również gdybym (zamiast usuwania scalone słowników) dodać x: Key = „klucz” atrybut, a następnie jawnie przypisać ten styl do każdego przycisku.

Na czym polega problem? Dlaczego pierwszy pomija "Button1", a drugi nie?

+0

Co the--? Masz rację! Nigdy wcześniej tego nie widziałem. +1 dla ładnej reprodukcyjnej próbki kodu. –

+0

Brzmi jak błąd w WPF. Pamiętam, że w rzeczywistości istniał problem z słownikami zasobów z jednym wejściem. Czy mógłbyś spróbować dodać jeszcze jeden (manekin) przedmiot do słownika zasobów, który zawiera ten styl? (Nie mam teraz kompilatora.) – Vlad

+0

Miałem ten sam problem, gdy miałem dwa przyciski, każdy z panelem kominowym i 2 etykietami wewnątrz. pierwsza etykieta nie dostałaby stylizacji, ale pozostałe 3 by. darn Błędy WPF ... Ktoś wie, jak mogę zgłosić błąd? –

Odpowiedz

16

Widziałem już ten problem kilka razy wcześniej i jest to dość dziwny "błąd". Dzieje się tak, gdy wstawiasz Style bezpośrednio w ResourceDictionary wewnątrz <ResourceDictionary.MergedDictionaries>. Numer Style jest pomijany dla pierwszego elementu. Ten kod daje ten sam wynik, styl jest pomijany w pierwszym ListBoxItem

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary> 
       <Style TargetType="{x:Type ListBoxItem}"> 
        <Setter Property="Foreground" Value="Green"/> 
       </Style> 
      </ResourceDictionary> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 
<ListBox> 
    <ListBoxItem Content="Item 1"/> 
    <ListBoxItem Content="Item 2"/> 
    <ListBoxItem Content="Item 3"/> 
</ListBox> 

Aby oba style i MergedDictionaries do pracy, zrobić to w ten sposób zamiast

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Resources/AllResources.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     <Style TargetType="{x:Type Button}"> 
      <Setter Property="FontSize" Value="100"/> 
     </Style> 
    </ResourceDictionary> 
</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <Button Grid.Column="0" Content="1" Name="Button1"/> 
    <Button Grid.Column="1" Content="2" Name="Button2"/> 
</Grid> 
+1

który działał! dzięki. Sądzę, że miałem wrażenie, że słownik zasobów nie może mieć stylów, jeśli łączył słowniki. –

+0

Hej, naprawdę dziwne. Dzięki za twoje jasne wyjaśnienie, zadziałało bezbłędnie. –

+0

To jest niesamowite. – Gadzooks34

4

Chociaż nie produkują błąd, zgodnie z dokumentacją:

słownikiem wykorzystywane w połączonych słowników nie powinna mieć treść i należy użyć właściwości Source odnieść się do innego słownik pośrednio. W rzeczywistości, jeśli umieścisz Style w słowniku zasobów i odniesiemy oba do scalania, działa tak, jak powinien.

Możemy tylko spekulować, dlaczego nie jest to obsługiwane, ale ponieważ tak nie jest, a ponieważ obejście problemu jest łatwe, nie możemy narzekać zbyt gorzko, poza tym, że żałujemy, że nie otrzymaliśmy błędu podczas kompilacji.

Powiązane problemy