C# Avalonia 18- ControlTemplates - ColorPickerUserControlTest

news/2025/11/16 14:39:43/文章来源:https://www.cnblogs.com/dalgleish/p/19228150

自定义ColorPicker2类

ColorPicker2.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Metadata;
using Avalonia.Controls.Primitives;
using Avalonia.Media;
using System;namespace AvaloniaUI
{[TemplatePart("PART_RedSlider", typeof(Slider))][TemplatePart("PART_GreenSlider", typeof(Slider))][TemplatePart("PART_BlueSlider", typeof(Slider))]public class ColorPicker2 : 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 ColorPicker2(){// 当 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();}}
}

ColorPicker.axaml代码

<Styles xmlns="https://github.com/avaloniaui"xmlns:local="using:AvaloniaUI"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Design.PreviewWith></Design.PreviewWith><!-- Add Styles Here --><Style Selector="local|ColorPicker2"><Setter Property="Template"><Setter.Value><ControlTemplate><Border Background="{TemplateBinding Background}"BorderBrush="{TemplateBinding BorderBrush}"BorderThickness="{TemplateBinding BorderThickness}"Padding="{TemplateBinding Padding}"><Grid ColumnDefinitions="*,auto"RowDefinitions="auto,auto,auto"ColumnSpacing="8"RowSpacing="4"><Slider Name="PART_RedSlider"Minimum="0" Maximum="255"Foreground="Red"Background="#22FF0000"VerticalAlignment="Center"><Slider.Resources><SolidColorBrush x:Key="SliderThumbBackground" Color="Red"/></Slider.Resources></Slider><Slider Name="PART_GreenSlider"Grid.Row="1"Minimum="0" Maximum="255"Foreground="LimeGreen"Background="#2200FF00"VerticalAlignment="Center"><Slider.Resources><SolidColorBrush x:Key="SliderThumbBackground" Color="LimeGreen"/></Slider.Resources></Slider><Slider Name="PART_BlueSlider"Grid.Row="2"Minimum="0" Maximum="255"Foreground="DodgerBlue"Background="#220000FF"VerticalAlignment="Center"><Slider.Resources><SolidColorBrush x:Key="SliderThumbBackground" Color="DodgerBlue"/></Slider.Resources></Slider><Border Grid.Column="1" Grid.RowSpan="3"Width="50" Height="50"BorderBrush="Black"BorderThickness="1"CornerRadius="4"Margin="4,0,0,0"><Border.Background><SolidColorBrush Color="{Binding Color, RelativeSource={RelativeSource TemplatedParent}}"/></Border.Background></Border></Grid></Border></ControlTemplate></Setter.Value></Setter></Style>
</Styles>

ColorPickerUserControlTest.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"Width="300" Height="300"xmlns:local="using:AvaloniaUI"x:Class="AvaloniaUI.ColorPickerUserControlTest"Title="ColorPickerUserControlTest"><StackPanel><local:ColorPicker2 x:Name="colorPicker"Margin="2" Padding="3"Color="Beige"></local:ColorPicker2><Button x:Name="cmdGet" HorizontalAlignment="Center"Margin="5,20,5,0" Padding="2"Click="cmdGet_Click">Get Color</Button><Button x:Name="cmdSet" HorizontalAlignment="Center"Margin="5,0,5,0" Padding="2"Click="cmdSet_Click">Reset Color</Button><Button Margin="5,0,5,0" Padding="2" HorizontalAlignment="Center"Click="cmdUndo_Click">Undo</Button><TextBlock x:Name="lblColor" Margin="10" HorizontalAlignment="Center"/></StackPanel>
</Window>

ColorPickerUserControlTest.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
using Shares.Avalonia;namespace AvaloniaUI;public partial class ColorPickerUserControlTest : Window
{private readonly UndoRedoManager undoManager = new();public ColorPickerUserControlTest(){InitializeComponent();this.Load("avares://AvaloniaUI/Demos/Book/18/CustomControls/ColorPicker.axaml");//这个是在我的扩展里实现了,以后不再重复这些自定义的函数了。undoManager.Attach(colorPicker, ColorPicker2.ColorProperty);//这个是在之前的RedoUndo例子里}// 点击“Get Color”按钮private void cmdGet_Click(object? sender, RoutedEventArgs e){if (colorPicker != null){var color = colorPicker.Color;// Avalonia 中没有 WPF 的 MessageBox,可用自定义对话框或简单显示文本:lblColor.Text = $"当前颜色:{color}";}}// 点击“Reset Color”按钮private void cmdSet_Click(object? sender, RoutedEventArgs e){if (colorPicker != null){colorPicker.Color = Colors.Beige;}}// 响应 ColorChanged 事件private void colorPicker_ColorChanged(object? sender, ColorChangedEventArgs e){if (lblColor != null){lblColor.Text = $"颜色变为:{e.NewColor}";}}private void cmdUndo_Click(object? sender, RoutedEventArgs e){undoManager.Undo(colorPicker);}
}

运行效果

image

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/967098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《重生之我成为世界顶级黑客》第四章:实践出真知

《重生之我成为世界顶级黑客》第四章:实践出真知停更一下,今天还有事忙,先这样吧。清晨,天还没亮,龙傲天便已经被胃部持续不断的震痛所唤醒。 那不是尖锐的刺痛,而是一种沉闷的、带着灼烧感的疼痛,仿佛有块烧红…

Spring AI Alibaba 项目源码学习(九)-其他继承BaseAgent

其他继承BaseAgent 实现分析 请关注微信公众号:阿呆-bot 概述 本文档分析 Spring AI Alibaba Agent Framework 中除 ReactAgent 和 FlowAgent 之外的其他 BaseAgent 实现,主要包括 A2aRemoteAgent(Agent-to-Agent 远…

Linux进程状态 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

mybatis_generate_demo

UserInfoMapperimport org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository;import java.util.List;@Repository public interface UserInfoMapper {/*** 新增 1 条记录,若成功则…

换歌换歌

后天换歌换成下面三首歌的一首行不行(哪首会的人比较多) 我用什么把你留住 我的纸飞机 像风一样

GaN 器件第三象限导通特性

GaN 器件第三象限导通特性2025-11-16 14:35 斑鸠,一生。 阅读(0) 评论(0) 收藏 举报 一、原理The condition to turn on the channel for reverse conduction is the gate to drain voltage Vgd is higher than t…

CMake+MinGW+vcpkg项目引入三方库的两种方式(手动路径,vcpkg)

搬运自自己的CSDN博客:https://blog.csdn.net/Tracker647/article/details/142070768 原帖日期2024年9月9日。 接到个新项目,用到很多三方库,从对接的同事那了解到vcpkg这个工具,周末试用了下,确实很方便,以前需…

Spring AI Alibaba 项目源码学习(八)-Flow Agent 分析

Flow Agent 分析 请关注微信公众号:阿呆-bot 概述 本文档分析 Spring AI Alibaba Agent Framework 中的 Flow Agent 系列,包括 FlowAgent 基类、SequentialAgent、ParallelAgent、LoopAgent 和 LlmRoutingAgent 的具…

Why did Hitler become a greater Napoleon?

Because Napoleon never attached any meanings to the cross or inborn ability.

vcpkg交叉编译

搬运自自己的CSDN博客:https://blog.csdn.net/Tracker647/article/details/149149713 原帖日期2025年7月6日。 前言 维护的一个项目,由于特殊的技术原因,需要横跨Windows, Linux, ARMLinux三个平台去维护,因此每次…

详细介绍:什么是机械设备制造ERP?哲霖软件如何助力企业实现降本增效?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

python -m pip install 就行 我pip install就不行?

python -m pip install 就行 我pip install就不行?离奇现象 直接输入pip相关命令用不了,返回如下信息: Fatal error in launcher: Unable to create process using "C:\Users\86178\AppData\Local\Programs\Py…

Personalized QRCode - 个性化自定义二维码生成器

Personalized QRCode - 个性化自定义二维码生成器. 个性化二维码生成器 使用您自己的图片创建独特的个性化二维码 几秒钟内生成美观的个性化二维码。 上传您的图片,自定义您的二维码,与世界分享。 https://qrcode.ch…

对“机器人VCU”进行一个详细、架构的讲解。

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Qt编写28181推流分发服务/统计访问数量/无人观看超时关闭/等待重新点播/复用点播

一、前言说明 本以为之前写的国标GB28181服务端程序已经够完善了,不料又来个新的需求,需要配合流媒体服务程序进行处理,本着给钱就干的原则,把mediamtx和zlm的http请求接口研究了下,需求主要两个,一个是需要统计…

20232407 2025-2026-1 《网络与系统攻防技术》 实验五实验报告

1.实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取信息 (2)尝试获取BBS、论坛、QQ、MSN中某一好友的IP地址,并查询获取该好友所在的具体地理位置 (3)使用nmap开源软件…

实现string类

#pragma once#include <cstddef> #include <cstring> #include <algorithm> #include <stdexcept>// namespace M { class string { public:static const size_t s_min_capacity; private:cha…

实用指南:Vue 实例生命周期

实用指南:Vue 实例生命周期2025-11-16 14:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

React Native创建AndroidIOS流程完整指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Ducky - BPMN 工作流管理系统

Ducky - BPMN 工作流管理系统 https://github.com/fanqingsong/ducky/tree/main 一个基于 FastAPI 和 SpiffWorkflow 的 BPMN 2.0 工作流管理系统,提供完整的流程定义管理、实例执行和可视化功能。功能特性核心功能✅…