2010-11-25 12 views

答えて

4

要素が明示的に割り当てられたスタイルを持っていないとき、WPFは、キーと要素の型を使用して、FindResourceを呼び出すことによって、そのスタイルを見つけたので、これは動作しません。キーがButtonBaseのスタイルを作成したという事実は重要ではありません。WPFは、キーがButtonまたはToggleButtonのスタイルを見つけてそれを使用します。

継承ベースのルックアップメソッドは、要素の型を使用してスタイルをルックアップし、要素の型のスタイルが見つからなかった場合は基本型を使用します(スタイルまたはヒットが見つかるまで続行します)FrameworkElement) 。問題は、一致するものが見つからない場合、つまりButtonの既定のスタイルがない場合にのみ機能しますが、もちろんあります。

あなたができることは2つあります。 1つは、スタイルのBasedOnプロパティを使用して独自のスタイル階層を実装する、Jensの示唆を行うことです。しかし、すべての単一のタイプにスタイルを定義する必要があるので、それは厄介なことです。そうしないと、そのタイプのデフォルトのWPFスタイルが使用されます。

もう1つの方法は、このルックアップの動作を実装するStyleSelectorを使用することです。このように:

public class InheritanceStyleSelector : StyleSelector 
{ 
    public InheritanceStyleSelector() 
    { 
     Styles = new Dictionary<object, Style>(); 
    } 
    public override Style SelectStyle(object item, DependencyObject container) 
    { 
     Type t = item.GetType(); 
     while(true) 
     { 
      if (Styles.ContainsKey(t)) 
      { 
       return Styles[t]; 
      } 
      if (t == typeof(FrameworkElement) || t == typeof(object)) 
      { 
       return null; 
      } 
      t = t.BaseType; 
     } 
    } 

    public Dictionary<object, Style> Styles { get; set; } 
} 

あなたは、こののインスタンスを作成し、それをスタイルのセットを与え、その後、任意のItemsControlに添付することができます。

<Window x:Class="StyleSelectorDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:StyleSelectorDemo="clr-namespace:StyleSelectorDemo" Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <StyleSelectorDemo:InheritanceStyleSelector x:Key="Selector"> 
      <StyleSelectorDemo:InheritanceStyleSelector.Styles> 
       <Style x:Key="{x:Type ButtonBase}"> 
        <Setter Property="ButtonBase.Background" 
          Value="Red" /> 
       </Style> 
       <Style x:Key="{x:Type ToggleButton}"> 
        <Setter Property="ToggleButton.Background" 
          Value="Yellow" /> 
       </Style> 
      </StyleSelectorDemo:InheritanceStyleSelector.Styles> 
     </StyleSelectorDemo:InheritanceStyleSelector> 
    </Window.Resources> 
    <Grid> 
     <ItemsControl ItemContainerStyleSelector="{StaticResource Selector}"> 
      <Button>This is a regular Button</Button> 
      <ToggleButton>This is a ToggleButton.</ToggleButton> 
      <TextBox>This uses WPF's default style.</TextBox> 
     </ItemsControl> 
    </Grid> 
</Window> 
1

これは確かにスタイリングシステムの限界であるようです。

この問題に直面して、私はいくつかの基本スタイルを宣言し、私が気にしたすべての子孫に対してこれを「サブスタイル化」しました。

<Style x:Key="ButtonBaseStyle" TargetType="{x:Type ButtonBase}"> 
    <!-- Style stuff --> 
</Style> 
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonBaseStyle}"> 
    <!-- Additional style stuff for button only --> 
</Style> 
<Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource ButtonBaseStyle}"> 
    <!-- Additional style stuff for toggle button only --> 
</Style> 
<!-- more ButtonBase descendants here --> 
関連する問題