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

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

cs 复制代码
<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 文件中。(这是用于保存控件图像的典型代码。)

cs 复制代码
// 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 像素/英寸分辨率和默认像素格式。然后它调用Grid的Render方法,使其将自身(及其内容)绘制到RenderTargetBitmap上。

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

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

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

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

相关推荐
蹊黎5 小时前
C++中vector类的部分简单实现
开发语言·c++·visual studio
程序猿追11 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓11 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播11 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
墨云安全12 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
摇滚侠13 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y13 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
jimy114 小时前
c++的 Type Traits (一)
开发语言·c++
Web极客码15 小时前
Python Ollama 本地 Agent 入门与订单查询实践
开发语言·jvm·python
kimnoic15 小时前
PHP 8.2的DNF类型怎么用才规范
开发语言·php