WPF自定义控件08:FlatRoundImage

举报
jackwangcumt 发表于 2021/09/25 10:15:33 2021/09/25
【摘要】 在不少的应用程序中,用户中心的个人页面经常需要显示头像,这个当前主流的做法就是用户上传一个图片,系统进行截取并显示为一个圆形的轮廓,即圆形的照片。本文将介绍一下自定义的图片控件FlatRoundImage,它是一个UserControl控件,自身携带UI样式和后台逻辑。

       在不少的应用程序中,用户中心的个人页面经常需要显示头像,这个当前主流的做法就是用户上传一个图片,系统进行截取并显示为一个圆形的轮廓,即圆形的照片。本文将介绍一下自定义的图片控件FlatRoundImage,它是一个UserControl控件,自身携带UI样式和后台逻辑。下面将详细介绍具体的实现细节。

1 WPF项目结构


    基于之前创建的WPF示例项目,在其中创建一个新的关于FlatRoundImage用户控件项目文件。添加过程如下图所示:

1.jpg

添加成功后,本项目文件结构,如下图所示:

3.jpg

      与之前的自定义控件不同,用户控件类型的项目文件UI和后台逻辑是在一起的,这样也非常的方便。另外,这种方式创建的自定义控件不需要将其注册到Generic.xaml文件中。

2 WPF FlatRoundImage实现


    首先,在控件的UI界面上,UserControl类的控件原生带有UI布局,即像一个窗口一样,可以通过拖入已有的控件进行UI设计,因此从布局到功能上都更加的方便。FlatRoundImage控件,布局界面如下:

4.jpg

其中的核心代码如下:

<UserControl x:Class="Yd.WpfControls.FlatRoundImage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Yd.WpfControls"
             mc:Ignorable="d" 
             Width="100"
             Height="100"
             BorderThickness="0"
             RenderOptions.BitmapScalingMode="HighQuality"
             UseLayoutRounding="True"
             TextOptions.TextFormattingMode="Display"
             d:DesignHeight="100" d:DesignWidth="100" x:Name="uc">
    <Grid>
        <Ellipse Width="{Binding ElementName=uc, Path=Width}" 
                 Height="{Binding ElementName=uc, Path=Width}" 
                 StrokeThickness="1" 
                 SnapsToDevicePixels="True"
                 Stroke="{Binding ElementName=uc, Path=Stroke}" >
            <Ellipse.Fill>
                <ImageBrush x:Name="PART_IMG" 
                            ImageSource="{Binding ElementName=uc, Path=ImgSource}"  />
    <!--<ImageBrush x:Name="PART_IMG" ImageSource="{Binding ImgSource}" /> not work-->
            </Ellipse.Fill>
        </Ellipse>
    </Grid>
</UserControl>

    其中的圆形边框是通过Ellipse实现的,设置长度和宽度一致,即是圆形。 StrokeThickness="1" 表示边框宽度为1。圆形中的背景图是通过Ellipse.Fill属性的,给出了ImageBrush对象,它具有ImageSource属性,可绑定具体的图片URI。这里需要注意一下:ImageSource="{Binding ElementName=uc, Path=ImgSource}"这种绑定是成功的,而ImageSource="{Binding ImgSource}"是无法正确绑定属性的。

   下面再给出FlatRoundImage自定义控件的后台代码,具体如下所示:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace Yd.WpfControls
{
    /// <summary>
    /// FlatRoundImage.xaml 的交互逻辑
    /// </summary>
    public partial class FlatRoundImage : UserControl
    {
        public FlatRoundImage()
        {
            InitializeComponent();
        }
       
        public static readonly DependencyProperty ImgSourceProperty =
        DependencyProperty.Register("ImgSource", typeof(string), typeof(FlatRoundImage)
            ,new PropertyMetadata("/Image/avatar.png"));
        public string ImgSource
        {
            get { return (string)GetValue(ImgSourceProperty); }
            set
            {
                SetValue(ImgSourceProperty, value);
            }
        }

        public static readonly DependencyProperty StrokeProperty =
   DependencyProperty.Register("Stroke", typeof(Brush), typeof(FlatRoundImage)
       , new PropertyMetadata(Brushes.Silver));
        public Brush Stroke
        {
            get { return (Brush)GetValue(StrokeProperty); }
            set
            {
                SetValue(StrokeProperty, value);
            }
        }

    }
}

其中定义了两个控件的依赖属性,即ImgSource和Stroke,一个代表背景图片的地址,一个代表边框的颜色。

3 WPF FlatRoundImage测试


    首先,需要重新生成一下项目文件,然后在WpfControls项目中添加一个窗口Window6,并在此窗口中添加自定义控件FlatRoundImage,Window6.xaml部分示例代码如下:

<Window
        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:WpfControls"
        xmlns:WpfControls="clr-namespace:Yd.WpfControls;assembly=Yd.WpfControls" x:Class="WpfControls.Window6"
        mc:Ignorable="d"
        Title="Window6" Height="350" Width="400">
    <Grid Background="Green">

        <WpfControls:FlatRoundImage HorizontalAlignment="Center" Margin="0,93,0,0" 
                  VerticalAlignment="Top" ImgSource="/Image/avatar.png"/>

        <WpfControls:FlatRoundImage HorizontalAlignment="Center" Margin="0,222,0,0" 
                  Height="60" Width="60"
                  VerticalAlignment="Top" ImgSource="/Image/avatar.png"/>

    </Grid>
</Window>

另外需要注意的就是,图片路径如果无法找到,则可能需要进行图片素材的输出资源配置,将其作为资源输出到目录中,示意图如下所示:

5.jpg

运行界面如下:

6.jpg

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。