WPF RingShape
//cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp116 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } public class RingShape : Shape { Rect _rect; static RingShape() { StretchProperty.OverrideMetadata(typeof(RingShape), new FrameworkPropertyMetadata(Stretch.Uniform, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender)); } public double RingWidth { get { return (double)GetValue(RingWidthProperty); } set { SetValue(RingWidthProperty, value); } } // Using a DependencyProperty as the backing store for RingWidth. This enables animation, styling, binding, etc... public static readonly DependencyProperty RingWidthProperty = DependencyProperty.Register("RingWidth", typeof(double), typeof(RingShape), new FrameworkPropertyMetadata(0.1, FrameworkPropertyMetadataOptions.AffectsRender)); protected override Geometry DefiningGeometry { get { if (_rect.IsEmpty) { return Geometry.Empty; } var rc = _rect; rc.Inflate(-RingWidth * _rect.Width, -RingWidth * _rect.Height); return new CombinedGeometry(GeometryCombineMode.Exclude, new EllipseGeometry(_rect), new EllipseGeometry(rc)); } } protected override Size MeasureOverride(Size constraint) { if (double.IsInfinity(constraint.Width) || double.IsInfinity(constraint.Height)) { _rect = Rect.Empty; return Size.Empty; } double size; switch (Stretch) { case Stretch.Fill: _rect = new Rect(constraint); break; case Stretch.Uniform: size = Math.Min(constraint.Width, constraint.Height); _rect = new Rect(new Size(size, size)); break; case Stretch.UniformToFill: size = Math.Max(constraint.Width, constraint.Height); _rect = new Rect(new Size(size, size)); break; case Stretch.None: _rect = double.IsNaN(Width) || double.IsNaN(Height) ? Rect.Empty : new Rect(new Size(Width, Height)); break; } return _rect.Size; } } } //xaml <Window x:Class="WpfApp116.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 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" xmlns:local="clr-namespace:WpfApp116" mc:Ignorable="d" WindowState="Maximized" Title="MainWindow" Height="450" Width="800"> <Grid> <local:RingShape Fill="Red" Stroke="Black" StrokeThickness="4" RingWidth="0.15"/> </Grid> </Window>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2019-05-28 error: open(".vs/ConsoleApp349/v16/Server/sqlite3/db.lock"): Permission denied error: unable to index file