c# - WPF按钮未在悬停时应用所有属性
问题描述
我正在为我正在开发的一些软件设计一个自定义登录窗口,并且我已经达到了可以处理这一切的美学的地步。
我在 C# 和 WPF 方面有相当多的经验,但在谈到使用 WPF 的技术性和“正确”的做事方式时,我仍然认为自己是新手。
我有以下代码用于我根据自己的喜好修改的按钮:
<Button Content="Log In" FontSize="22" FontWeight="Bold" Foreground="White" Cursor="Hand">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}" BorderBrush="#FF343434" BorderThickness="0">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<LinearGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterY="0.5" CenterX="0.5"/>
<SkewTransform CenterY="0.5" CenterX="0.5"/>
<RotateTransform Angle="-45" CenterY="0.5" CenterX="0.5"/>
<TranslateTransform/>
</TransformGroup>
</LinearGradientBrush.RelativeTransform>
<GradientStop Color="#FF00A3E0" Offset="0"/>
<GradientStop Color="#FFAB6BE3" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF00A3E0"/>
<Setter Property="BorderBrush" Value="#FF343434"/>
<Setter Property="BorderThickness" Value="5"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
<Button.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</Button.Resources>
</Button>
如您所见,默认情况下,我所拥有的只是一种渐变色,当鼠标悬停在它上面时,它会(至少应该)变为带有边框的纯色。
我最终得到的只是背景颜色的变化,而边框没有任何变化。我不确定我是否必须写出一个完整的控制模板才能让它工作(如果可能的话,我想避免它)或者我只是盯着它太久而看不到明显的错误。
提前致谢!
解决方案
长话短说,事实证明,出于某种原因,我需要在模板中命名边框对象并在模板中应用触发器,以便能够指定必须将BorderBrush
andBorderThickness
属性应用于所述边框。
这是最终代码:
<Button Grid.Column="1" Grid.Row="9" Content="Log In" x:Name="log_in_button">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}" BorderBrush="#FF343434" BorderThickness="1" x:Name="log_in_button_border">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF00A3E0"/>
<Setter Property="BorderBrush" Value="#FF343434" TargetName="log_in_button_border"/>
<Setter Property="BorderThickness" Value="2" TargetName="log_in_button_border"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="FontSize" Value="22"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="FontFamily" Value="/Password Manager;component/Resources/#Lato"/>
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<LinearGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterY="0.5" CenterX="0.5"/>
<SkewTransform CenterY="0.5" CenterX="0.5"/>
<RotateTransform Angle="-45" CenterY="0.5" CenterX="0.5"/>
<TranslateTransform/>
</TransformGroup>
</LinearGradientBrush.RelativeTransform>
<GradientStop Color="#FF00A3E0" Offset="0"/>
<GradientStop Color="#FFAB6BE3" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
</Button.Style>
<Button.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="10"/>
</Style>
</Button.Resources>
</Button>
然而,我很好奇是否有人可以解释这个版本的工作,而不是我在问题中发布的那个(我喜欢当事情工作时,但当我理解为什么时我更喜欢它)。
谢谢!
推荐阅读
- ios - 尝试从 UIViewController 到 Weather API 的序列数据
- haskell - 如何使用 nix 从 GitHub 源 .nix 文件构建 haskell 依赖项?
- ms-access - 将带计数的 MS Access 转换查询转换为 SQL Server PIVOT
- c++ - typedef operator() 未针对 std::map 排序进行编译
- r - RMarkdown 内联表
- react-redux - typeerror _this.store 未定义 react redux
- c++ - 将DLL打包成exe并运行后删除
- rust - 在 Rust 中是否有等效于 Haskell 的迭代?
- mysql - MySQL 的 VBA 连接问题 - 连接在宏的顶部,但不是底部
- angular - 切片不适用于Angular Material Angular 6中的分页