样式(2)———样式继承BaseOn

楔子:新的布局时,样式想跟之前的不一样,但又想继承之前的样式,有什么办法?

解决这个问题方式之一,可以通过样式继承的方式。

如下面的代码片段:

<Style x:Key="ButtonPrimary" BasedOn="{StaticResource ButtonBaseStyle}" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="{DynamicResource PrimaryBrush}" />
        <Setter Property="BorderBrush" Value="{DynamicResource PrimaryBrush}" />
    </Style>

定义了一个按钮样式ButtonPrimary,这个样式基于另一个名为ButtonBaseStyle的基础样式,并设置了按钮的背景和边框颜色使用动态资源PrimaryBrush。以下是对这段代码的解释和如何使用它:

  1. 样式键(x:Key): ButtonPrimary是这个样式的名称,您可以使用这个名称来引用这个样式。

  2. 基础样式(BasedOn): {StaticResource ButtonBaseStyle}表示这个样式是基于名为ButtonBaseStyle的静态资源。这意味着ButtonPrimary样式将继承ButtonBaseStyle中定义的所有属性和行为。

  3. 目标类型(TargetType): {x:Type Button}指定这个样式是针对Button控件的。

  4. 设置器(Setter):

    • 第一个Setter设置了按钮的Background(背景)属性,使用动态资源{DynamicResource PrimaryBrush}来定义背景颜色。
    • 第二个Setter设置了按钮的BorderBrush(边框颜色)属性,同样使用动态资源{DynamicResource PrimaryBrush}
  5. 动态资源(DynamicResource): 使用{DynamicResource}意味着在运行时每次引用这些资源时,WPF都会去查找最新的资源值。这与{StaticResource}不同,后者只在第一次引用时查找资源值,之后即使资源值改变,使用{StaticResource}的引用也不会更新。

要使用这个样式,需要在XAML中将按钮的Style属性绑定到ButtonPrimary样式:

<Button Style="{StaticResource ButtonPrimary}" Content="Click Me" />

请确保PrimaryBrush资源已经在相应的资源字典中定义,例如在<Window.Resources><App.xaml><Application.Resources>中:

<Application.Resources>
    <SolidColorBrush x:Key="PrimaryBrush" Color="#0078D7" />
</Application.Resources>

在这个例子中,PrimaryBrush是一个SolidColorBrush资源,定义了一个颜色值#0078D7,这可以是一个十六进制颜色值或任何WPF支持的颜色定义。

此外,确保ButtonBaseStyle资源也已经定义,它应该包含按钮的一些基本样式设置,例如字体大小、边框厚度等,ButtonPrimary样式将继承这些设置。如果ButtonBaseStyle没有定义,你需要先创建它,或者从现有的样式中继承。

总结:通过以上例子,就可以方便的进行样式继承。

### Winform 中实现 IO 信号灯亮灭效果的方法 在 Windows Forms (WinForms) 应用程序中,可以使用 `PictureBox` 或自定义控件来模拟 LED 数码管的效果并实现 IO 信号灯的亮灭功能。考虑到实际应用需求以及避免出现不亮、仅小数点亮等问题[^1],推荐采用以下方法: #### 使用 PictureBox 控件 通过设置 `PictureBox` 的背景图片属性可以在不同状态下切换不同的图像文件,从而达到视觉上的亮灭效果。 ```csharp private void ToggleSignalLight(PictureBox signalLight, bool isOn) { if (isOn) signalLight.Image = Properties.Resources.Light_On; // 假设资源名为 Light_On else signalLight.Image = Properties.Resources.Light_Off; // 假设资源名为 Light_Off } ``` 为了使界面更加友好,在处理特定事件时可以通过改变指示灯的状态来进行反馈,这有助于用户直观了解系统的当前状态[^2]。 #### 自定义 SignalLight 用户控件 如果希望拥有更灵活的设计,则可以选择创建一个继承自 `UserControl` 的新组件——`SignalLight`。这样不仅可以封装好所有的逻辑代码,还可以轻松调整样式以适应各种应用场景。 ```csharp public partial class SignalLight : UserControl { private Color _onColor; private Color _offColor; public SignalLight() { InitializeComponent(); this.Size = new Size(30, 30); this.BackColor = OffColor; } [Category("Appearance")] public Color OnColor { get => _onColor; set { _onColor = value; Refresh(); } } [Category("Appearance")] public Color OffColor { get => _offColor; set { _offColor = value; Refresh(); } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); using (Brush brush = new SolidBrush(this.Enabled ? (_state ? OnColor : OffColor) : SystemColors.Control)) e.Graphics.FillEllipse(brush, ClientRectangle); } private bool _state; public bool State { get => _state; set { _state = value; Invalidate(); // 强制重绘控件 } } } ``` 上述代码展示了如何构建一个简单的圆形信号灯控件,并允许开发者指定开启和关闭两种颜色。当更新 `State` 属性时会触发重新绘制整个控件区域的操作,进而显示出最新的外观变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值