私は現在WPFを学習しようとしており、スタイルを使用してデフォルトの.Netコントロールの外観を変えることを検討しています。以下のコードはすべてWPFマークアップですが、C#を優先言語として使用しています。
私は今日、新しいテーマでgmailをセットアップし(下の画像を参照)、したがって、自分自身に挑戦を設定しました。これは、WPFで実行できます。
私が何とか達成したのはSpam
、コントロールテンプレートとトリガーを備えたスタイルを使用して中央のボタンを作成することです。
右ボタンと左ボタンは非常に似ていますが、違いは2つだけです。左側または右側のコーナー半径は1、マージンは15ですが、中央のボタンでは両方とも0に設定されています。
質問!
Q1。スタイル全体をコピーしてこれら2つの属性だけを変更するのではなく、ある種の継承を介して行うことができます。左右のボタンは既存のスタイルに基づいていますが、これら2つの視覚的な変更を行います。新しいスタイルを作成するときにすでにBasedOnプロパティを試しましたが、必要な属性を編集できませんでした。
Q2。スタイルは、WPFでこの問題に対処するための正しい方法です。WinFormsでは、列挙型にリンクされた表示プロパティを持つカスタムコントロールを作成することを検討します。つまり、ボタンをクリックすると、スタイルオプションが左、中央、右になります。
Q3。最後まで最も難しい質問。それを作ることは可能ですか、それでボタンに私のスタイルが適用されている場合。次に、背景色を青に設定すると。次に、ボタンはグラデーションを維持しますが、オフホワイトではなく、青の色合いになります。つまり、背景の線形グラデーションブラシは、ボタンに適用された背景色を上書きするのではなく、に基づいています。または、これらに個別のスタイルを定義する必要がありますか?私は個人的に、これが達成できるという背後にあるタイプのコード、つまりWPFマークアップの単一のブラシからグラデーションブラシを作成することなしにはわかりません。
つまり、青いボタンと灰色/通常のボタンの下にあるボタン
私のスタイル
<Style x:Key="GoogleMiddleButton" TargetType="{x:Type Button}">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,1" EndPoint="0,0">
<GradientStop Color="#F1F1F1" Offset="0"/>
<GradientStop Color="#F5F5F5" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="#666666"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Name="dropShadowBorder"
BorderThickness="0,0,0,1"
CornerRadius="1"
>
<Border.BorderBrush>
<SolidColorBrush Color="#00000000"/>
</Border.BorderBrush>
<Border Name="border"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
CornerRadius="0"
Background="{TemplateBinding Background}">
<Border.BorderBrush>
<SolidColorBrush Color="#D8D8D8"/>
</Border.BorderBrush>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" TargetName="border">
<Setter.Value>
<SolidColorBrush Color="#939393"/>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" TargetName="dropShadowBorder">
<Setter.Value>
<SolidColorBrush Color="#EBEBEB"/>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="#333333"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,1" EndPoint="0,0">
<GradientStop Color="#F1F1F1" Offset="1"/>
<GradientStop Color="#F5F5F5" Offset="0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
ps上記のWPFで初心者の間違いを見つけた場合は、遠慮なく私に指摘してください。