N O W L O A D I N G . . .
こんにちは
先週日曜日は仕事。
日曜日はボイラーが非稼働。
よって、室温8度。
さて、今回は。
またまた開発ネタ。
開発というよりも、お遊び。
標準でキモいボタンをなんとかすべく、コントロールテンプレートを作成したが、前回は昼休憩が終了したため時間切れ。
本日はそれをカスタムコントロール化した。
これでライブラリとして他の開発からでも利用可能。
こんなボタン一つ誰が使うねんwww
ボタンの動作はマテリアルデザインを参考に。
ボタンのカラーはBootstrap4を参考に。
命名「BootMaterialButton」
キモさ軽減できたwwwww
今回は、前回のものに加えて角の丸め具合を追加。
カスタムコントロールにするにあたり、プロパティのバインドを追加している。
ControlTemplate
<Grid Margin="5">
<Border
Name="Border"
Panel.ZIndex="0"
Background="{TemplateBinding DefaultBackgroundColor}"
BorderBrush="{TemplateBinding DefaultBorderColor}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="{TemplateBinding CornerRadius}">
<Border.Effect>
<DropShadowEffect
x:Name="Shadow"
BlurRadius="5"
Direction="315"
Opacity="0.5"
ShadowDepth="3"
Color="Gray" />
</Border.Effect>
</Border>
<Border
Name="BorderWhite"
Panel.ZIndex="1"
Background="White"
BorderBrush="Transparent"
BorderThickness="0"
CornerRadius="{TemplateBinding CornerRadius}"
Opacity="0" />
<Border
Name="BorderContent"
Panel.ZIndex="2"
Background="Transparent"
BorderBrush="Transparent"
BorderThickness="0"
CornerRadius="{TemplateBinding CornerRadius}"
FocusManager.FocusedElement="{Binding ElementName=contentPresenter}">
<ContentPresenter Name="contentPresenter" />
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="Border" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FocusedBackgroundColor}" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Border" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisabledBackgroundColor}" />
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Border" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisabledBackgroundColor}" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="BorderWhite"
Storyboard.TargetProperty="Opacity"
To="0.3"
Duration="0:0:0.3" />
<DoubleAnimation
Storyboard.TargetName="Shadow"
Storyboard.TargetProperty="Opacity"
To="0.8"
Duration="0:0:0.3" />
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="BorderWhite"
Storyboard.TargetProperty="Opacity"
To="0"
Duration="0:0:0.3" />
<DoubleAnimation
Storyboard.TargetName="Shadow"
Storyboard.TargetProperty="Opacity"
To="0.5"
Duration="0:0:0.3" />
</Storyboard>
</BeginStoryboard>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
サクッとVBで以下のプロパティを作成。
・DefaultBackgroundColor
・DefaultBorderColor
・FocusedBackgroundColor
・DisabledBackgroundColor
・CornerRadius
ビルドすればDLLとして作成される。
・プロジェクトの参照設定に作成したDLLを追加
・コントロールを使用するXAMLの参照を追加
xmlns:controls="clr-namespace:OriginalControl;assembly=OriginalControl"
・リソースにスタイル定義を追加
<!-- Primary -->
<Style x:Key="OriginalButtonStylePrimary" TargetType="controls:OriginalButton">
<Setter Property="DefaultBackgroundColor" Value="#007bff" />
<Setter Property="Foreground" Value="White" />
<Setter Property="CornerRadius" Value="5" />
</Style>
<!-- Success -->
<Style x:Key="OriginalButtonStyleSuccess" TargetType="controls:OriginalButton">
<Setter Property="DefaultBackgroundColor" Value="#28a745" />
<Setter Property="Foreground" Value="White" />
<Setter Property="CornerRadius" Value="5" />
</Style>
<!-- Danger -->
<Style x:Key="OriginalButtonStyleDanger" TargetType="controls:OriginalButton">
<Setter Property="DefaultBackgroundColor" Value="#ffc107" />
<Setter Property="Foreground" Value="White" />
<Setter Property="CornerRadius" Value="5" />
</Style>
<!-- Warning -->
<Style x:Key="OriginalButtonStyleWarning" TargetType="controls:OriginalButton">
<Setter Property="DefaultBackgroundColor" Value="#dc3545" />
<Setter Property="Foreground" Value="White" />
<Setter Property="CornerRadius" Value="5" />
</Style>
<!-- Info -->
<Style x:Key="OriginalButtonStyleInfo" TargetType="controls:OriginalButton">
<Setter Property="DefaultBackgroundColor" Value="#17a2b8" />
<Setter Property="Foreground" Value="White" />
<Setter Property="CornerRadius" Value="5" />
</Style>
・ボタンを配置
<controls:OriginalButton
Height="50"
Margin="5"
Style="{StaticResource OriginalButtonStylePrimary}">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="Primary" />
</controls:OriginalButton>
<controls:OriginalButton
Height="50"
Margin="5"
Style="{StaticResource OriginalButtonStyleSuccess}">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="Success" />
</controls:OriginalButton>
<controls:OriginalButton
Height="50"
Margin="5"
Style="{StaticResource OriginalButtonStyleWarning}">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="Warning" />
</controls:OriginalButton>
<controls:OriginalButton
Height="50"
Margin="5"
Style="{StaticResource OriginalButtonStyleInfo}">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="Info" />
</controls:OriginalButton>
<controls:OriginalButton
Height="50"
Margin="5"
Style="{StaticResource OriginalButtonStyleDanger}">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="Danger" />
</controls:OriginalButton>
こんなふうに配置される。
ま、こんな感じか。
カラー定義はプロパティにすればいいかと思ったが、あまりガチガチにしてしまうと後で応用できず困るので却下。
スタイルとして定義することにした。スタイル定義はシステムに合わせて共通リソースファイルを作ると楽だろう。
今回は、ボタンに動作を付けていないので「Command」プロパティは空っぽ。
せっかく作るのに、なんだかさみしいね。