首页 > 其他分享 >Avalonia开发实践(三)——GroupBox

Avalonia开发实践(三)——GroupBox

时间:2024-07-24 11:29:03浏览次数:14  
标签:streamGeometryContext Point Top 实践 GroupBox new rect Avalonia

一、开发背景

近期在项目中要用到GroupBox,结果发现Avalonia原生框架中竟然没有这一控件。想着这个控件也不算复杂,索性就自己实现一个好了。

二、坑的开始

熟悉桌面开发的朋友一定对下面这个经典的GroupBox样式不陌生——

 这个样式看似简单,实则也不难实现。只要解决对标题处边框的擦除或遮盖这一个小问题就可以了。在WPF中,是用了OpacityMask来实现的。而在Avalonia中,仍然保留了这一属性,使得我们能很轻松地实现控件模板的移植。

但是事实真的这样吗?

当我把GroupBox的原生模板移植到Avalonia中,并且原模原样地实现了一个BorderGapMaskConverter之后,我发现该模板并不能正常工作。于是我单独写了个关于Border边框部分遮挡的用例,才发现DrawingBrush/VisualBrush并不能给OpacityMask使用,会发生如下报错:

Unable to cast object of type 'Avalonia.Media.DrawingBrush' to type 'Avalonia.Media.IImmutableBrush

 后来在github上的源码仓库下也发现有人提了相同的issue,但似乎到今日仍未解决。。。

issue链接

三、开辟新思路

既然用遮罩的方式没办法实现,那不如就单纯画一个带有缺口的边框好了!

四、实现过程

1、先编写一个缺口矩形生成器,使用Geometry的图形生成指令

public static Geometry GetRoundedRectangleWithGap(Rect rect, double radiusX, double radiusY, double gapValue1, double gapValue2, Dock gapDock = Dock.Top)
{
    StreamGeometry streamGeometry = new StreamGeometry();
    using (StreamGeometryContext streamGeometryContext = streamGeometry.Open())
    {
        var arcSize = new Size(radiusX, radiusY);
        var startPoint = new Point(Math.Max(gapValue1, gapValue2), rect.Top);
        var endPoint = new Point(Math.Min(gapValue1, gapValue2), rect.Top);
        streamGeometryContext.BeginFigure(startPoint, true);
        streamGeometryContext.LineTo(new Point(rect.Right - radiusX, rect.Top));
        streamGeometryContext.ArcTo(new Point(rect.Right, rect.Top + radiusY), arcSize, PiO

标签:streamGeometryContext,Point,Top,实践,GroupBox,new,rect,Avalonia
From: https://blog.csdn.net/wsadcg/article/details/140626316

相关文章

  • 深入理解Java虚拟机:JVM高级特性与最佳实践-第三章-垃圾收集器与内存分配策略
    在java内存运行时区域中的各个部分中,程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑如何回收的问题,当方法结束或者线程结束时,内存自然就跟随着回收了。但是Java堆和方法区这两个区域具有......
  • Java并发编程的高级技术与最佳实践
    Java并发编程的高级技术与最佳实践大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来深入探讨Java并发编程的高级技术与最佳实践。并发编程是Java开发中的一项重要技能,它能够充分利用多核处理器的优势,提高应用程序的性能和响应能力。本文将从高级......
  • 微服务架构设计中的Java最佳实践
    微服务架构设计中的Java最佳实践大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨在微服务架构设计中,如何在Java中应用最佳实践。一、微服务架构概述微服务架构是一种软件架构风格,它将单一应用程序拆分为一组小型服务,每个服务运行在自己的......
  • Vue 在大型项目中的架构设计和最佳实践
    前面分享了很多八股和算法,现在开始慢慢进入项目搭建随着项目规模的扩大,合理的架构设计和最佳实践变得尤为重要。一个良好的架构能够提高开发效率、维护性和可扩展性。本文将探讨在大型Vue项目中,如何进行架构设计并遵循最佳实践。一、项目结构一个清晰的项目结构有助于代码的......
  • SpringBoot整合WebSocket实践
    简介先来看下维基百科WebSocket的简介:WebSocket是一种与HTTP不同的协议。两者都位于OSI模型的应用层,并且都依赖于传输层的TCP协议。虽然它们不同,但是RFC6455中规定:itisdesignedtoworkoverHTTPports80and443aswellastosupportHTTPproxiesandintermediaries......
  • 使用PHP实现悲观锁的最佳实践。里面包含源码
    在数据库编程中,确保数据的一致性和完整性是非常重要的。当多个用户或线程同时访问和修改同一条数据记录时,可能会出现并发问题,比如读写冲突、数据丢失等。为了解决这些问题,我们可以使用并发控制机制,其中一种常见的方法就是悲观锁。什么是悲观锁?悲观锁是一种并发控制策......
  • .NET跨平台UI框架Avalonia 11.1重磅发布
    本篇为译文原文地址 https://avaloniaui.net/blog/avalonia-11-1-a-quantum-leap-in-cross-platform-ui-developmentgithub地址 https://github.com/AvaloniaUI/Avalonia 史蒂文·柯克发布于7月22日我们很高兴地宣布发布Avalonia11.1,这是对我们喜爱的跨平台UI框......
  • AI绘画入门实践 | Midjourney:画面权重控制
    在Midjourney中,使用两个连续的英文冒号::来进行分割与权重控制。作为分隔符使用在提示词中添加双冒号::表示让MJ将部分提示词单独考虑2d illustration, french fries, hot dog --v 62d illustration, french fries, hot:: dog --v 6作为权重......
  • ✨分享心得,点亮信心✨两个月前端基础+半个月实践能做什么
    Hello,小伙伴大家好,我是小VIE,一名学习前端时长两月半的前端萌新(ノ◡◝)这次主要是分享我在前端两个月的学习过程心得和半个月的实践成果,希望无论是准备秋招的同学,还是日常中学习、工作、求职的小伙伴都能得到一些信心!如果你想直接知道能做什么?那么我半个月的实践成果,也许可以......
  • JngLoad.dll 缺失报错问题全解:从原理到实践的修复流程
    jngload.dll是一个动态链接库(DynamicLinkLibrary)文件,通常与处理JPEG2000图像格式的软件相关联。JPEG2000是一种高效率的图像压缩标准,jngload.dll可能包含了处理这种图像格式所需的功能和算法。这个DLL文件常出现在处理图形和图像的软件中,比如某些图像编辑软件或游戏,用来读......