スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

スタイル定義(リソース)って上から順に適用するんだね。

自分が拡張したコントロールに基底コントロールのスタイルをデフォルトで適用してくれないかと思った。
例えば、TextBoxクラスを拡張したとする。
using System.Windows;
using System.Windows.Controls;

namespace TawamureDays {

/// <summary>
/// 拡張TextBox
/// </summary>
public class CustomTextBox : TextBox {
}
}
これを使って配置しても、CustomTextBoxのTextBoxのスタイル適用がされていないように見える。
<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TawamureDays"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBox">
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Black"/>
</Style>
</StackPanel.Resources>
<TextBox />
<local:CustomTextBox/>
</StackPanel>
</Window>

20121015_1
じゃあ、何も設定されていないのか?という事になると、どうも違うらしい。
カスタムコントロールでよくある実装をしてみた。
    /// <summary>
/// 拡張TextBox
/// </summary>
public class CustomTextBox : TextBox {

#region staticコンストラクタ

/// <summary>
/// staticコンストラクタ
/// </summary>
static CustomTextBox() {
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTextBox),
new FrameworkPropertyMetadata(typeof(CustomTextBox)));

return;
}

#endregion
}
これをビルドして実行すると、何も表示されなくなる。
20121015_2
なので、TextBoxのスタイルを完全に無視しているわけではない感じ。
Styleをキー無しで定義すると、それがデフォルトとして扱われるんだけど、localでデフォルトのスタイルを定義しても、既に適用されているようで、適用した後にその定義を上書きしても反映されないようだ。
自分がlocalで定義したTextBoxのスタイルをCustomTextBoxに引き継がせたい時は↓のようにする。
<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TawamureDays"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBox">
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Black"/>
</Style>
<Style TargetType="{x:Type local:CustomTextBox}"
BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="BorderBrush" Value="Red"/>
</Style>
</StackPanel.Resources>
<TextBox />
<local:CustomTextBox/>
</StackPanel>
</Window>

20121015_3
WPF Inspectorで見るとこんな感じ。
20121015_5

この定義の順番ってのは結構大事。定義の順序を変えてみる。
<Window x:Class="TawamureDays.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TawamureDays"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<StackPanel.Resources>
<Style TargetType="{x:Type local:CustomTextBox}"
BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="BorderBrush" Value="Red"/>
</Style>
<Style TargetType="TextBox">
<Setter Property="Background" Value="AliceBlue"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Black"/>
</Style>
</StackPanel.Resources>
<TextBox />
<local:CustomTextBox/>
</StackPanel>
</Window>

20121015_4
localのStyleではなく、標準のTextBoxスタイルを引き継ぐようだ。上から定義した順に読み込んで適用していくんだね。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。