2011-01-27 14 views
23

12個のボタンがある単純なWPFウィンドウがあります。私はそれらのすべてに同じスタイルを適用したい。このコードは、同じエラーを生成します。WPFは最初の要素にスタイルを適用しません

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

最初のボタンがそれに適用されるスタイルを取得していないが、2番目の1が行います。私はキーを設定し、すべてのボタンでそれを使用することができますが、私はWPFがそれを処理することを好むでしょう。私は、これを書いているうちに、外部のResourceDictionaryを含まないと、期待どおりに動作することを発見しました。これは、同じリソースを共有する必要がある複数のウィンドウがあるため、アプリケーションが拡張されるため、今後問題になります。以下のように変更されたコードは次のとおりです。キー=「キー」属性その後、明示的に各ボタンにそのスタイルを割り当てる:

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

私は(代わりにマージされた辞書を除去する)は、xを追加する場合にも動作します。

ここで問題は何ですか?なぜ、最初のものは "Button1"をスキップし、2番目のものはスキップしないのですか?

+0

何the--?あなたが正しい!私は以前これを見たことがない。再現性の良いコードサンプルを+1してください。 –

+0

WPFのバグのように聞こえます。私は実際には単一エントリのリソース辞書に問題があったことを覚えています。スタイルを含むリソース辞書にもう1つ(ダミー)アイテムを追加してみてください。 (私は今コンパイラを持っていません。) – Vlad

+0

2つのボタンがあり、それぞれにスタックパネルと2つのラベルが付いているとき、同じ問題がありました。最初のラベルはスタイリングを得ることはできませんでしたが、他の3つはスタイルになります。誰かがバグレポートを提出する方法を知っていますか? –

答えて

16

私はこの問題を数回前に見てきました。これはかなり奇妙な "バグ"です。あなたがStyleを直接ResourceDictionary<ResourceDictionary.MergedDictionaries>に入れると起こります。 Styleは、最初の項目はスキップされます。このコードは、同じ結果を生成し、スタイルは、スタイルとMergedDictionariesの両方を動作させるために最初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> 

のためにスキップされ、このようにそれを行う代わりに、

<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

はうまくいった!ありがとう。私は、辞書がマージされていれば、リソース辞書にスタイルを持たせることができないという印象を受けたと思います。 –

+0

うわあ、本当にかわいい。あなたの明確な説明のおかげで、それは完璧に働いた。 –

+0

それは素晴らしいです。 – Gadzooks34

4

それはマニュアルに従って、エラーを生成しませんが:

をマージされた辞書で使用辞書はコンテンツを持つべきではないし、別のを参照するためにSourceプロパティを使用する必要があります辞書を間接的に使用する。実際にはStyleをリソースディクショナリに入れ、その両方をマージで参照すると、それは正常に動作します。

なぜこれがサポートされていないのだろうかと思っていますが、そうではないため、回避策が簡単なので、コンパイル時にエラーが発生した場合を除き、

関連する問題