は私がButtonBase
クラスとその子孫にスタイルを適用するにはどうすればいいですか?
<Style
TargetType="{x:Type ButtonBase}">
<Setter
Property="Cursor"
Value="Hand" />
</Style>
から派生するすべてのコントロールに次のスタイルを適用したいしかし、それだけではない、その子孫のために、特定のクラスのために働きます。私が意図するものを達成する方法?
は私がButtonBase
クラスとその子孫にスタイルを適用するにはどうすればいいですか?
<Style
TargetType="{x:Type ButtonBase}">
<Setter
Property="Cursor"
Value="Hand" />
</Style>
から派生するすべてのコントロールに次のスタイルを適用したいしかし、それだけではない、その子孫のために、特定のクラスのために働きます。私が意図するものを達成する方法?
要素が明示的に割り当てられたスタイルを持っていないとき、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>
これは確かにスタイリングシステムの限界であるようです。
この問題に直面して、私はいくつかの基本スタイルを宣言し、私が気にしたすべての子孫に対してこれを「サブスタイル化」しました。
<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 -->