当前位置: 首页 > news >正文

C# Avalonia 18- ControlTemplates - ColorPickerTwoWays

通过xaml来定义Template样式。

ColorPicker.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives;
using Avalonia.Media;
using System;namespace Shares.Avalonia.CustomControls;[TemplatePart("PART_RedSlider", typeof(Slider))]
[TemplatePart("PART_GreenSlider", typeof(Slider))]
[TemplatePart("PART_BlueSlider", typeof(Slider))]
public class ColorPicker : TemplatedControl
{public static readonly StyledProperty<Color> ColorProperty =AvaloniaProperty.Register<ColorPicker, Color>(nameof(Color), Colors.Black);public static readonly StyledProperty<double> RedProperty =AvaloniaProperty.Register<ColorPicker, double>(nameof(Red), 0);public static readonly StyledProperty<double> GreenProperty =AvaloniaProperty.Register<ColorPicker, double>(nameof(Green), 0);public static readonly StyledProperty<double> BlueProperty =AvaloniaProperty.Register<ColorPicker, double>(nameof(Blue), 0);private Slider? redSlider;private Slider? greenSlider;private Slider? blueSlider;private IDisposable? colorSubscription;private IDisposable? redSubscription;private IDisposable? greenSubscription;private IDisposable? blueSubscription;public ColorPicker(){// 当 Color 变化 → 更新 RGBcolorSubscription = this.GetObservable(ColorProperty).Subscribe(OnColorChanged);// 当任意 RGB 变化 → 更新 ColorredSubscription = this.GetObservable(RedProperty).Subscribe(_ => UpdateColorFromRgb());greenSubscription = this.GetObservable(GreenProperty).Subscribe(_ => UpdateColorFromRgb());blueSubscription = this.GetObservable(BlueProperty).Subscribe(_ => UpdateColorFromRgb());}public Color Color{get => GetValue(ColorProperty);set => SetValue(ColorProperty, value);}public double Red{get => GetValue(RedProperty);set => SetValue(RedProperty, value);}public double Green{get => GetValue(GreenProperty);set => SetValue(GreenProperty, value);}public double Blue{get => GetValue(BlueProperty);set => SetValue(BlueProperty, value);}private void OnColorChanged(Color color){// 更新 RGBRed = (double)color.R;Green = (double)color.G;Blue = (double)color.B;}private void UpdateColorFromRgb(){var newColor = Color.FromRgb((byte)Red, (byte)Green, (byte)Blue);if (newColor != Color)Color = newColor;}protected override void OnApplyTemplate(TemplateAppliedEventArgs e){base.OnApplyTemplate(e);redSlider = e.NameScope.Find<Slider>("PART_RedSlider");greenSlider = e.NameScope.Find<Slider>("PART_GreenSlider");blueSlider = e.NameScope.Find<Slider>("PART_BlueSlider");if (redSlider != null)redSlider[!!Slider.ValueProperty] = this[!!RedProperty];if (greenSlider != null)greenSlider[!!Slider.ValueProperty] = this[!!GreenProperty];if (blueSlider != null)blueSlider[!!Slider.ValueProperty] = this[!!BlueProperty];}protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e){base.OnDetachedFromVisualTree(e);colorSubscription?.Dispose();redSubscription?.Dispose();greenSubscription?.Dispose();blueSubscription?.Dispose();}
}

ColorPickerTwoWays.axaml代码

<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Height="350" Width="300"xmlns:local="using:AvaloniaUI"x:Class="AvaloniaUI.ColorPickerTwoWays"Title="ColorPickerTwoWays"><Window.Resources><ControlTemplate x:Key="FancyColorPickerTemplate" TargetType="local:ColorPicker2"><Border Background="LightGoldenrodYellow"BorderBrush="Black"BorderThickness="1"Padding="8"><Grid RowDefinitions="*,auto" ColumnDefinitions="*,auto,auto,auto"><!-- 通用样式 --><Grid.Styles><Style Selector="Slider"><Setter Property="Orientation" Value="Vertical"/><Setter Property="TickFrequency" Value="10"/><Setter Property="Minimum" Value="0"/><Setter Property="Maximum" Value="255"/><Setter Property="Margin" Value="5"/></Style><Style Selector="TextBlock"><Setter Property="Margin" Value="3"/><Setter Property="FontSize" Value="10"/><Setter Property="HorizontalAlignment" Value="Center"/></Style></Grid.Styles><!-- 圆形颜色显示 --><Ellipse Grid.Column="0" Grid.RowSpan="2"Margin="10" Stroke="LightGray" StrokeThickness="5" Height="120"><Ellipse.Fill><SolidColorBrush Color="{Binding Color, RelativeSource={RelativeSource TemplatedParent}}"/></Ellipse.Fill></Ellipse><!-- 三个滑块 --><Slider x:Name="PART_RedSlider" Grid.Column="1"/><TextBlock Grid.Row="1" Grid.Column="1" Text="RED"/><Slider x:Name="PART_GreenSlider" Grid.Column="2"/><TextBlock Grid.Row="1" Grid.Column="2" Text="GREEN"/><Slider x:Name="PART_BlueSlider" Grid.Column="3"/><TextBlock Grid.Row="1" Grid.Column="3" Text="BLUE"/></Grid></Border></ControlTemplate></Window.Resources><StackPanel><!-- 第一个颜色选择器 --><local:ColorPicker2x:Name="colorPicker1"Margin="2" Padding="3"Color="AliceBlue"/><!-- 第二个颜色选择器使用 Fancy 模板,并与第一个双向绑定 --><local:ColorPicker2x:Name="colorPicker2"Margin="5,20,5,5"Template="{StaticResource FancyColorPickerTemplate}"Color="{Binding #colorPicker1.Color, Mode=TwoWay}"/></StackPanel>
</Window>

ColorPickerTwoWays.axaml.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Shares.Avalonia;namespace AvaloniaUI;public partial class ColorPickerTwoWays : Window
{public ColorPickerTwoWays(){InitializeComponent();this.Load("avares://AvaloniaUI/Demos/Book/18/CustomControls/ColorPicker.axaml");}
}

运行效果

image

 

http://www.zskr.cn/news/51694.html

相关文章:

  • 享元模式实验围棋软件
  • The 4th Universal Cup. Stage 5: Grand Prix of Nanjing 做题笔记
  • 上述
  • 解密Prompt系列64. Anthropic Skils的延伸思考
  • 悟空来路与关山:AI元人文的终极眺望
  • nssm管理redis服务
  • pyslam(3) 开发语义建图 - MKT
  • Java 字节流与字符流
  • 精读GitHub - swift-markdown-ui
  • Bash的快捷键
  • Linux系统编程初步——冯诺依曼体系结构的理解
  • 2. 使用Gin处理HTTP请求
  • C++之复合类型(四) - Invinc
  • 物流管理,必须掌握的10个要点 - 智慧园区
  • 工程行业中-使用AI报价得可行性-一般(属于能应付但不精确,未测试在数据库全得情况下得效果,总体欠调教)
  • 每日反思(2025_11_16)
  • libvte, xfce4-terminal和gnome-terminal,干货满满
  • 寄卖业务质检1
  • [学习记录整理] ---IP地址,网关,掩码,DNS等
  • 2025 年 11 月不锈钢管件厂家权威推荐榜:欧标卡压管件,国标/薄壁/沟槽不锈钢管件,90/45弯头管件源头厂家精选
  • 2025.11.16总结
  • LeeCode_2 两数相加
  • 2025 年 11 月 CNC 高压清洗机厂家推荐排行榜,CNC全自动高压清洗机,CNC高压去毛刺清洗机,卧式/双工位CNC高压清洗机,数控高压清洗去毛刺机公司推荐
  • 2025 年 11 月 Q355B/Q345B/16Mn 冷拔扁钢厂家推荐排行榜,优质冷拔扁钢,高强度扁钢,精密扁钢公司精选
  • 2025 年 11 月 Q355B/Q345B/16Mn 冷拔圆钢厂家推荐排行榜,优质冷拔圆钢,高强度圆钢,合金结构钢圆钢公司精选
  • 图像算法处理-OpenCV图像翻转SSE版(ippicv)复现
  • 2025 年 11 月西服定制厂家推荐排行榜,兰州西服定制,婚纱/结婚/职业/男士/女士/团体/职场/新郎/定做/西装/礼服/工作服/职业装/公务员西服定制公司推荐
  • 2025 年 11 月防水网厂家推荐排行榜,防水网,味头防水网,专业防水网源头厂家实力解析与选购指南
  • 2025 年 11 月中医师承确有专长权威推荐榜:师承教育、专长医师资格考核与合法执业路径深度解析
  • 2025 年 11 月 Q355B/Q345B/16Mn 冷拉圆钢厂家推荐排行榜,高强度结构钢,低合金圆钢,精密冷拉钢材公司精选