ControlTemplate の共通色を変更する
-
12-09-2019 - |
質問
複数の要素で同じ色を使用する ControlTemplate があります。特定のトリガーで (例:OnMouseOver)その色を変更したいと思います。私が見る限り、色を変更するにはすべての要素にセッターを定義する必要があります。含まれているすべての要素がアクセスでき、トリガーによって変更できるテンプレート内の共有リソースを参照する方法はありますか。これにより、すべての要素に対処する必要がなくなりますか?
これが(作られた)例です:
<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Ellipse Fill="red" Grid.Column="0"/>
<Ellipse Fill="red" Grid.Column="1"/>
<ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
コントロールが無効になっているときは、楕円を灰色にしたいのですが、 両方を明示的に設定せずに, 、例えば私 しないでください 書きたい
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="_ellipse1" Property="Fill" Value="Grey"/>
<Setter TargetName="_ellipse2" Property="Fill" Value="Grey"/>
</Trigger>
ただし、両方の楕円の色を設定するだけです 1つ セッター。
解決
ボタンの代わりに、楕円 (省略記号?) のスタイルにトリガーを配置します。ボタンに IsEnabled = false を設定すると、IsEnabled が下に伝播します。
<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}">
<ControlTemplate.Resources>
<Style TargetType="{x:Type Ellipse}">
<Setter Property="Fill" Value="Red" />
<Style.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Fill" Value="Gray" />
</Trigger>
</Style.Triggers>
</Style>
</ControlTemplate.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Ellipse Grid.Column="0"/>
<Ellipse Grid.Column="1"/>
<ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
他のヒント
これを行う最良の方法は、値コンバータを使用することだと思います。そうすれば、厄介なトリガーを完全に回避できます。これはあなたの例ですが、コンバータが追加されています。
<Window.Resources>
<local:EnabledToColorConverter x:Key="enabledToColorConverter"/>
<ControlTemplate x:Key="myTemplate" TargetType="{x:Type Button}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Ellipse Name="_ellipse1" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="0"/>
<Ellipse Name="_ellipse2" Fill="{TemplateBinding IsEnabled, Converter={StaticResource enabledToColorConverter}}" Grid.Column="1"/>
<ContentPresenter Grid.ColumnSpan="2" VerticalAlignment="Center"/>
</Grid>
</ControlTemplate>
</Window.Resources>
<StackPanel>
<Button Template="{StaticResource myTemplate}">Enabled Button</Button>
<Button Template="{StaticResource myTemplate}" IsEnabled="False">Disabled Button</Button>
</StackPanel>
そして、コンバータは次のとおりです。
public class EnabledToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool isEnabled = (bool)value;
return isEnabled ?
Brushes.Red :
Brushes.Gray;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
所属していません StackOverflow