gpt4 book ai didi

c# - 更改样式控件中的控件模板的一部分?

转载 作者:行者123 更新时间:2023-11-30 21:40:39 24 4
gpt4 key购买 nike

我已经使用 ControlTemplate 自定义了 ToggleButton 控件,如下所示:

<StackPanel>
<StackPanel.Resources>
<Style x:Key="OptionBarButton" TargetType="{x:Type ToggleButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border Padding="18,12,18,12" Background="{TemplateBinding Background}">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="True" />
<Condition Property="IsMouseOver" Value="True" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Background" Value="DarkBlue" />
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="True" />
<Condition Property="IsMouseOver" Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Background" Value="SkyBlue" />
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="False" />
<Condition Property="IsMouseOver" Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Background" Value="#88000000" />
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="False" />
<Condition Property="IsMouseOver" Value="True" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Background" Value="#F0000000" />
</MultiTrigger.Setters>
</MultiTrigger>
</ControlTemplate.Triggers>

</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</StackPanel.Resources>

<ToggleButton Style="{StaticResource OptionBarButton}">
<Image Source="../Assets/icons/action.png" Height="26" RenderOptions.BitmapScalingMode="Fant" />
</ToggleButton>

<ToggleButton Style="{StaticResource OptionBarButton}">
<Image Source="../Assets/icons/action2.png" Height="26" RenderOptions.BitmapScalingMode="Fant" />
</ToggleButton>

</StackPanel>

这很好用,但是我现在想更改某些样式控件中模板的某些部分,即 IsChecked 颜色状态(天蓝/深蓝)。

是否可以在使用模板时修改/传递这些颜色到模板中?我知道我可以使用附加属性或/和子类化 ToggleButton 类(向其添加依赖属性),但我想知道是否没有更惯用的方法来解决这个问题,也许只能使用 xaml。对于这样一个简单的用例,必须在 C# 中编写自定义代码似乎有点矫枉过正?

最佳答案

据我所知,如果没有代码,没有简单的方法可以做到这一点,但如果你真的想要 - 你可以以某种方式利用动态资源。通常动态资源用于在运行时更改所有控件实例的外观。您从模板中引用动态资源,然后更改该资源,所有控件都会反射(reflect)此更改。在这种情况下,这可能不是您所需要的,因为您想要更改“某些样式控件中模板的某些部分”。你仍然可以这样做:

<!-- default checked and over color -->
<SolidColorBrush x:Key="TgCheckedAndOver" Color="DarkBlue" />
<!-- default checked color -->
<SolidColorBrush x:Key="TgChecked" Color="SkyBlue" />
<Style
TargetType="{x:Type ToggleButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border Padding="18,12,18,12"
Background="{TemplateBinding Background}">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked"
Value="True" />
<Condition Property="IsMouseOver"
Value="True" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Background"
Value="{DynamicResource TgCheckedAndOver}" />
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked"
Value="True" />
<Condition Property="IsMouseOver"
Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Background"
Value="{DynamicResource TgChecked}" />
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked"
Value="False" />
<Condition Property="IsMouseOver"
Value="False" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Background"
Value="#88000000" />
</MultiTrigger.Setters>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked"
Value="False" />
<Condition Property="IsMouseOver"
Value="True" />
</MultiTrigger.Conditions>
<MultiTrigger.Setters>
<Setter Property="Background"
Value="#F0000000" />
</MultiTrigger.Setters>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

这是动态资源的常规使用。现在,当您只想为特定控件更改外观时,您可以这样做:

<ToggleButton>
<ToggleButton.Resources>
<!-- override default resources -->
<SolidColorBrush x:Key="TgChecked" Color="Yellow" />
<SolidColorBrush x:Key="TgCheckedAndOver"
Color="Green" />
</ToggleButton.Resources>
<Image Source="../Assets/icons/action.png" Height="26" RenderOptions.BitmapScalingMode="Fant" />
</ToggleButton>

因为您将具有相同键的新资源放置在离控件“更近”的位置 - 模板将使用它们而不是默认键,并且只有这个特定的控件会这样做,而不是所有的控件。

关于c# - 更改样式控件中的控件模板的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44406403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com