使用WPF,更新自定义按钮控件背景的最佳方法是什么?
时间:2020-03-06 14:44:38 来源:igfitidea点击:
在WPF中,我们正在创建自定义控件,这些控件继承自具有完全从头开始绘制的xaml图形的按钮。我们在整个按钮xaml周围都有一个边框,并且当触发器中MouseOver = True时,我们希望将其用作更新背景的位置。我们需要知道的是,当鼠标悬停在该按钮上时,如何用渐变更新该边框的背景?
解决方案
在ControlTemplate
中,为Border
提供一个Name
,然后我们就可以在触发器中引用其可视化树的那部分。这是重新设置普通Button
样式的非常简短的示例:
<Style TargetType="{x:Type Button}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Border Name="customBorder" CornerRadius="5" BorderThickness="1" BorderBrush="Black" Background="{StaticResource normalButtonBG}"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> </Border> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="customBorder" Property="Background" Value="{StaticResource hoverButtonBG}" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
如果这没有帮助,我们需要了解更多,可能会看到我们自己的XAML。描述让我不清楚,实际视觉树是什么。
我们可能想要添加这样的触发器...
制作这样的样式:
<Style x:Key="ButtonTemplate" TargetType="{x:Type Button}"> <Setter Property="Foreground" Value="{StaticResource ButtonForeground}" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Grid SnapsToDevicePixels="True" Margin="0,0,0,0"> <Border Height="20" x:Name="ButtonBorder" BorderBrush="{DynamicResource BlackBorderBrush}"> <TextBlock x:Name="button" TextWrapping="Wrap" Text="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}}" SnapsToDevicePixels="True" Foreground="#FFFFFFFF" Margin="6,0,0,0" VerticalAlignment="Center"/> </Border> </Grid> <ControlTemplate.Triggers> <!-- Disabled --> <Trigger Property="IsMouseOver" Value="True"> <Setter TargetName="ButtonBorder" Property="Background" Value="{DynamicResource ButtonBackgroundMouseOver}" /> <Setter TargetName="ButtonBorder" Property="BorderBrush" Value="{DynamicResource ButtonBorderMouseOver}" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
然后为渐变添加一些资源,如下所示:
<LinearGradientBrush x:Key="ButtonBackgroundMouseOver" EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF000000" Offset="0.432"/> <GradientStop Color="#FF808080" Offset="0.9"/> <GradientStop Color="#FF848484" Offset="0.044"/> <GradientStop Color="#FF787878" Offset="0.308"/> <GradientStop Color="#FF212121" Offset="0.676"/> </LinearGradientBrush>
如果我们需要更多帮助,请告诉我。