分类
标签
.NET 9008 adb android apt asp.net ASP.NET Core audio bug C c++ C++ chrome cmd csharp CSharp css css3 debian debug dotnet dotnet Framework dpkg GDI&GDI+ gdi&gdi+ golang graphics html html5 http java javascript json kali linux linux mci microsoft minimap MSBuild mysql OpenCV PInvoke powershell python QQ rust shell speex sql tutorial ubuntu ui unity vb.net visual studio Visual Studio web Web win32 winapi windows winform WinForm wpf WPF xaml xfce 列表 刷机 前端 加密 反射 反编译 可视化 图像处理 多线程 字符串 安卓 实例 局域网 幻影坦克 库 开发语言 异步 微信 手册 手机 接口 摘要 救砖 数字签名 数字证书 数字音频 数据库 桌面程序 游戏 游戏引擎 源码 爬虫 玩游戏 电脑硬件 笔记 算法 类库 线性代数 编程语言 网络 脚本语言 计算机图形学 计算机基础 设计模式 语音编解码 运维 进制 面向对象编程 音频 音频编码解码
416 字
2 分钟
[.NET/WPF] 设置按钮, 以及其他任何包含边框的控件的圆角
在 WPF 中, 按钮包含一个 “边框”, 很多时候需要设置按钮的圆角, 但是按钮并没有提供一个属性用来设置边框圆角.
下面以按钮为例, 列举几种常用的设置圆角的方式.
通过附加属性
定义一个附加属性, 然后在各个地方就能直接方便的使用了, 下面是实际使用方式:
<Button utils.BorderUtils.CornerRadius="3"/>
接下来是具体实现代码, 首先是一些工具方法:
using System.Windows.Media;
namespace System.Windows
{
public static class CommonUtils
{
public static void RunOnFirstLoaded(this FrameworkElement element, EventHandler handler)
{
void Once(object? sender, RoutedEventArgs e)
{
element.Loaded -= Once;
handler.Invoke(sender, e);
}
if (element.IsLoaded)
handler.Invoke(element, EventArgs.Empty);
else
element.Loaded += Once;
}
public static TElement? GetElementFromVisualTree<TElement>(this FrameworkElement control) where TElement : FrameworkElement
{
if (control is TElement ele)
return ele;
int childrenCount = VisualTreeHelper.GetChildrenCount(control);
for (int i = 0; i < childrenCount; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(control, i);
if (child is TElement eleChild)
return eleChild;
}
return null;
}
}
}
然后是 BorderUtils 这个类, 在其中定义 CornerRadius 附加属性:
using System;
using System.Windows.Controls;
using System.Windows.Media;
namespace System.Windows
{
public static class BorderUtils
{
[AttachedPropertyBrowsableForType(typeof(FrameworkElement))]
public static CornerRadius GetCornerRadius(DependencyObject obj)
{
return (CornerRadius)obj.GetValue(CornerRadiusProperty);
}
public static void SetCornerRadius(DependencyObject obj, CornerRadius value)
{
obj.SetValue(CornerRadiusProperty, value);
}
// Using a DependencyProperty as the backing store for CornerRadius. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CornerRadiusProperty =
DependencyProperty.RegisterAttached("CornerRadius", typeof(CornerRadius), typeof(BorderUtils), new PropertyMetadata(new CornerRadius(), CornerRadiusChanged));
private static void CornerRadiusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is not FrameworkElement ele)
return;
ele.RunOnFirstLoaded((s, _e) =>
{
if (CommonUtils.GetElementFromVisualTree<Border>(ele) is not Border border)
return;
border.CornerRadius = (CornerRadius)e.NewValue;
});
}
}
}
通过资源
直接在 Button 节点下添加一个 Border 的样式资源, 然后 Button 中的 Border 就会应用这个样式.
<Button>
<Button.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="3" />
</Style>
</Button.Resources>
</Button>
通过模板
很麻烦的一种方式, 不推荐
<Button>
<Button.Template>
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="7,7,7,7">
<Border.Background>#FFDDDDDD</Border.Background>
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" ></ContentPresenter>
</Border>
</ControlTemplate>
</Button.Template>
</Button>
[.NET/WPF] 设置按钮, 以及其他任何包含边框的控件的圆角
https://slimenull.com/posts/20230902085924/