使用WPF在C#中制作下载按钮

news/2025/1/15 8:24:34/

本示例使用 WPF 制作一个下载按钮。以下 XAML 代码显示了程序如何构建该按钮。

<Window x:Class="howto_download_button.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="Window1" Height="107" Width="140" Loaded="Window_Loaded"WindowStyle="ToolWindow"><Grid Background="Transparent" Name="grdMain"><!-- The button's background --><Ellipse Margin="5" StrokeThickness="5"><Ellipse.Fill><RadialGradientBrush><GradientStop Color="LightGreen" Offset="0"/><GradientStop Color="#FF00C000" Offset="1"/></RadialGradientBrush></Ellipse.Fill></Ellipse><!-- Text --><TextBlock FontFamily="Arial Rounded MT" FontSize="20"FontWeight="Bold" Foreground="Black"Margin="10" HorizontalAlignment="Center"VerticalAlignment="Center"TextWrapping="Wrap">Download</TextBlock><!-- Highlight --><Ellipse VerticalAlignment="Top"Height="30" Margin="20,8,20,0"Fill="White" Opacity="0.5"></Ellipse></Grid>
</Window>

程序窗口包含一个Grid控件,该控件包含两个Ellipse和一个TextBlock。第一个Ellipse定义按钮的背景。它填充了一个RadialGradientBrush,颜色从中心的 LightBlue渐变为边缘的深蓝色。

TextBlock显示文本“下载” 

第二个椭圆是白色的,位于其他控件的上方。它的位置从按钮顶部稍下方开始,垂直延伸到按钮的中间,但不会覆盖按钮的整个宽度。它的不透明度为 0.5,因此不透明度为 50%,其他控件会透过它显示出来。

考虑到按钮只使用了三个控件,结果相当不错。(当然,需要花很多功夫才能使结果与 Twitter 按钮相当匹配。)

启动时,程序使用以下代码将Grid控件的图像保存到 png 文件中。(这是用于保存控件图像的典型代码。)

// Save an image of the grid.
private void Window_Loaded(object sender, RoutedEventArgs e)
{// Render the grid.RenderTargetBitmap bm = new RenderTargetBitmap((int)grdMain.ActualWidth, (int)grdMain.ActualHeight,96, 96, PixelFormats.Default);bm.Render(grdMain);// Save the result into a file.using (var fileStream = new FileStream("Download.png",FileMode.Create)){BitmapEncoder encoder = new PngBitmapEncoder();encoder.Frames.Add(BitmapFrame.Create(bm));encoder.Save(fileStream);}
}

程序创建一个与Grid大小相同的RenderTargetBitmap,使用 96 像素/英寸分辨率和默认像素格式。然后它调用GridRender方法,使其将自身(及其内容)绘制到RenderTargetBitmap上。

接下来,程序创建一个FileStream,表示应包含图像的文件。它创建一个PngBitmapEncoder以 png 格式保存图像。

然后,程序调用编码器的Frames.Add方法向其添加新帧。它将由类的Create方法生成的新BitmapFrame传递给该方法,并将RenderTargetBitmap传递给该方法。

最后,在创建新帧之后,程序调用编码器的Save方法。

(如果这一切看起来令人烦恼,我同意。这是我对 WPF 最大的抱怨之一。尽管 .NET 程序员多年来一直在处理图像并将它们保存到文件中,但 WPF 使这变得更加困难。就好像 WPF 设计师以前从未保存过图像一样。事实上,几乎所有事情都变得更加困难。这让我怀疑设计 WPF 的开发人员是否曾经用 .NET 编程过。)


http://www.ppmy.cn/news/1562882.html

相关文章

file与io流(1)

-1- java.io.File类的使用 &#xff08;1&#xff09; 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆…

一些计算机零碎知识随写(25年1月)-1

我原以为世界上有技术的那批人不会那么闲&#xff0c;我错了&#xff0c;被脚本真实了。 今天正隔着画画呢&#xff0c;手机突然弹出几条安全告警通知。 急忙打开服务器&#xff0c;发现问题不简单&#xff0c;直接关服务器重装系统..... 首先&#xff0c;不要认为小网站&…

蓝桥杯历届真题 #食堂(C++,Java)

这题没什么好说的 考虑所有情况然后写就完了 虽然赛场上 交完不知道答案(doge) 原题链接 #include<iostream>using namespace std;int main() {int n;cin >> n;//能优先安排6人桌,要先安排6人桌//6人桌可以是222 或者 33 或者42//优先用33组合,因为3人寝只能凑6人…

《零基础Go语言算法实战》【题目 1-14】字符串的替换

《零基础Go语言算法实战》 【题目 1-14】字符串的替换 请编写一个函数&#xff0c;将字符串中的空格全部替换为“%20”。假定该字符串有足够的空间存 放新增的字符&#xff0c;并且知道字符串的真实长度&#xff08;≤ 1000&#xff09;&#xff0c;同时保证字符串由大小写的…

TP8 前后端分离开发验证码总是验证不正确问题

原因&#xff1a; 单独访问(不是前后端分离)每次前端生成验证码&#xff0c;都会带PHPSESSID值传递给后端&#xff0c;所以正常 前后端分离&#xff1a;前端每次不带PHPSESSID值传递给后端&#xff0c;所以后端每次都给一个新身份PHPSESSID值前端&#xff0c;造成前端每次PHPS…

vue2日历组件

这个代码可以直接运行&#xff0c;未防止有组件库没安装&#xff0c;将组件库的代码&#xff0c;转成文字了 vue页面 <template><div class"about"><div style"height: 450px; width: 400px"><div style"height: 100%; overflo…

OpenStack-Nova组件

Nova Nova架构实例管理调整实例大小cloud-init初始化主机聚合迁移实例配置文件 配置控制台配置VNC控制台SPICE 控制台串行控制台 常见报错主机未找到 OpenStack 的 Nova 组件是 OpenStack 云平台中的 计算服务&#xff08;Compute Service&#xff09;&#xff0c;主要负责管理…

一.项目课题 <基于TCP的文件传输协议实现>

客户端代码 需要cJSON.c文件和cJSON.h文件 在这里插入代码片#include "myheadth.h" #include "myfun.h"#define TIME 10 int sockfd; void heartbeat(int signum) {cJSON* root cJSON_CreateObject();cJSON_AddStringToObject(root,"request"…