silverlight 自定义控件基础篇(仿淘宝评论星级控件)

一套好用的 wpfUI控件源码 一套好用的 wpfUI控件源码一套好用的 wpfUI控件源码一套好用的 wpfUI控件源码一套好用的 wpfUI控件源码一套好用的 wpfUI控件源码 立即下载


首先说说今天的控件能干什么?

1,仿淘宝的评论星级控件,鼠标滑过星星,会变亮。

2,可以用来,展示某一类对象的状态,或者统计信息,比如说,某一类对象,有1~10不同的状态,10为满状态,那么该控件就能根据该对象的状态显示。

显示方法(状态为1的 亮一颗星,灰色的9颗星,状态为2的 亮2颗,灰色的8颗,以此类推)

该控件的属性

   <my:StarsControl Number="6" Stars="{Binding Num}" IsComment="True"  Margin="5" ClickMe="StarsControl_ClickMe" MoveMe="StarsControl_MoveMe" ></my:StarsControl>
                     

 

1,Number,要显示的总星数量,比如6,总共显示6颗星(如果用作评论星级,代表满级6星)

2,Stars,该对象的状态,也就是将会亮多少颗星,其他的星(灰色)

3,IsComment,表示该控件是否能鼠标滑过,更改星的状态。true表示更改,false表示只用来展示,不更改

事件

ClickMe,相当于每颗星星的点击事件

MoveMe,相当于每颗星星鼠标移动事件

StarsControl的XAML

<UserControl x:Class="TestDemo.StarsControl"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="800" d:DesignWidth="300">
    <!--将每个StankPanel做为容器,将星星添加进来-->
     <StackPanel Orientation="Horizontal" x:Name="item" Loaded="item_Loaded" >

    </StackPanel>

</UserControl>

后置代码.cs

 public partial class StarsControl : UserControl//评论星级,或显示信誉度
    {
        public StarsControl()
        {
            InitializeComponent();
        }

        //定义要显示的星星个数,默认5
        public static readonly DependencyProperty NumberProperty = DependencyProperty.Register("Number", typeof(int), typeof(StarsControl), new PropertyMetadata(5,new PropertyChangedCallback(NumberPropertyChanged)));


        public int Number
        {
            get { return (int)GetValue(NumberProperty); }
            set { SetValue(NumberProperty, value); }
        }
        public static void NumberPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            StarsControl starts = (StarsControl)obj;
            starts.Number = (int)args.NewValue;
        }


        //定义是用来显示用户信誉度,还是评星级的
        public static readonly DependencyProperty IsCommentProperty = DependencyProperty.Register("IsComment", typeof(bool), typeof(StarsControl), new PropertyMetadata(true, new PropertyChangedCallback(IsCommentPropertyChanged)));

         public bool  IsComment
        {
            get { return (bool)GetValue(IsCommentProperty); }
            set { SetValue(IsCommentProperty, value); }
        }
        public static void IsCommentPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            StarsControl starts = (StarsControl)obj;
            starts.IsComment = (bool)args.NewValue;
        }

        //该用户信誉度,总的信誉度是Number,默认亮4颗
        public static readonly DependencyProperty StarsProperty = DependencyProperty.Register("Stars", typeof(int), typeof(StarsControl), new PropertyMetadata(new PropertyChangedCallback(StarsPropertyChanged)));


        public int Stars
        {
            get { return (int)GetValue(StarsProperty); }
            set { SetValue(StarsProperty, value); }
        }

        public static void StarsPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            StarsControl test = (StarsControl)obj;
            string img = "/TestDemo;component/images/1.png";//亮的星星图片
            string img1 = "/TestDemo;component/images/0.png";//不亮的星星图片
         
            if ((int)args.NewValue >= test.Number)//判断该用户是的应该亮多少颗星
            {
                for (int i = 0; i < test.Number; i++)
                {
                    test.item.Children.Add(new Image() { Source = new BitmapImage(new Uri(img, UriKind.RelativeOrAbsolute)), Cursor = Cursors.Hand, ToolTip = new ToolTip() { Content = i + 1 } });
                }
            }
            else
            {
                int num = test.Number - (int)args.NewValue; //该用户没有达到满信誉,则算出不亮的星星有几颗
                int i;
                for (i = 0; i < (int)args.NewValue; i++)
                {
                    test.item.Children.Add(new Image() { Source = new BitmapImage(new Uri(img, UriKind.RelativeOrAbsolute)), Cursor = Cursors.Hand,ToolTip = new ToolTip() { Content=i+1 }});
                    
                }
              for (int j = 0; j < num; j++) //将不亮的星星加入StankPanel
                {
                    test.item.Children.Add(new Image() { Source = new BitmapImage(new Uri(img1, UriKind.RelativeOrAbsolute)), Cursor = Cursors.Hand, ToolTip = new ToolTip() { Content=i+j+1 } });

                }
            
            }
        }

        public Point InP;
        public Point OutP;
       
        private void item_Loaded(object sender, RoutedEventArgs e)
        {
            foreach (var v in ((StackPanel)sender).Children)//给所有的星星注册事件MouseMove,MouseLeave,MouseEnter
            {
                ((Image)v).MouseMove += new MouseEventHandler(StarsControl_MouseMove);
                ((Image)v).MouseLeave += new MouseEventHandler(StarsControl_MouseLeave);
                ((Image)v).MouseEnter += new MouseEventHandler(StarsControl_MouseEnter);
                ((Image)v).MouseLeftButtonDown += new MouseButtonEventHandler(StarsControl_MouseLeftButtonDown);//给每个星星注册一个MouseLeftButtonDown事件

            }
        }

        public delegate void Click(object sender, MouseButtonEventArgs e);
        public event Click ClickMe; //定义ClickMe事件,在调用此控件时,可以用该事件操作单个星星
        void StarsControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            ClickMe(sender, e);
        }

        int result = 0;//记录鼠标是不是第一进入控件
        void StarsControl_MouseEnter(object sender, MouseEventArgs e)
        {
            if (result == 0)//
            {
                InP.X = e.GetPosition((Image)sender).X + 10;//第一次,获取当前坐标将x+10
            }
            else {
                InP = e.GetPosition((Image)sender);//不是第一次 则就获取当前坐标
                result = 1;
            }
           
        }

        void StarsControl_MouseLeave(object sender, MouseEventArgs e)
        {
            if (result == 0)
            {
                OutP.X = e.GetPosition((Image)sender).X  -10;//第一次,获取当前坐标将x-10
            }
            else
            {
                OutP = e.GetPosition((Image)sender);//不是第一次 则就获取当前坐标
                result = 1;
            };
        }
        public delegate void Move(object sender, MouseEventArgs e);
        public event Move MoveMe; //定义移动事件(调用该控件,如果要在鼠标移动到每个星上更改对象的时候用)

        //为什么第一次进去和离开要加10和减10,是因为如果一开始 将鼠标移到最后一颗星上,在下面的判断中是相当的,就不会产生变化
        void StarsControl_MouseMove(object sender, MouseEventArgs e)
        {
            MoveMe(sender, e);
            if (((bool)GetValue(IsCommentProperty))==true)//如果是用作评论星级的
            {
                string img = "/TestDemo;component/images/1.png";
                string img1 = "/TestDemo;component/images/0.png";


                if (InP.X < OutP.X) //如果鼠标进入时的坐标小于出去时的坐标,就以为着鼠标在从左向右移动,将所有移过的星星变亮(加载亮星星的路径)
                {
                    ((Image)sender).Source = new BitmapImage(new Uri(img, UriKind.RelativeOrAbsolute));

                }
                else
                {
                    //从右向左在移动,星星变灰
                    ((Image)sender).Source = new BitmapImage(new Uri(img1, UriKind.RelativeOrAbsolute));
                }
                //第一颗星星永远亮着
                ((Image)item.Children[0]).Source = new BitmapImage(new Uri(img, UriKind.RelativeOrAbsolute));

            }
        }
    }


以上StarsControl控件已经Ok,下面调用

xaml

 <StackPanel  Name="stackPanel1"   >
        <ItemsControl  x:Name="Item">

            <ItemsControl.Template>
                <ControlTemplate TargetType="ItemsControl">
                    <Border BorderBrush="Aqua" BorderThickness="1" CornerRadius="15">
                        <ItemsPresenter/>
                    </Border>
                </ControlTemplate>
            </ItemsControl.Template>

            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                   <StackPanel Orientation="Horizontal" >
                        <TextBlock  Text="{Binding Name}" Margin="10"></TextBlock>
                        <my:StarsControl x:Name="starts" Number="6" Stars="{Binding Num}" IsComment="True"  Margin="5" ClickMe="StarsControl_ClickMe" MoveMe="StarsControl_MoveMe" ></my:StarsControl>
                        <TextBlock  Text="信誉度" Margin="10"></TextBlock>
                        <TextBlock  Text="{Binding Num}" Margin="10"></TextBlock>
                    </StackPanel>
                 </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

      
    </StackPanel>


后置代码绑定

public class person 
    
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int num;

        public int Num
        {
            get { return num; }
            set { num = value; }
        }
    }
List<person> list = new List<person>();
            list.Add(new person() { Name = "Jack", Num = 2 });
            list.Add(new person() { Name = "Jack", Num = 3 });
            list.Add(new person() { Name = "Jack", Num = 4 });
            list.Add(new person() { Name = "Jack", Num = 5 });
            list.Add(new person() { Name = "Jack", Num = 6 });
            list.Add(new person() { Name = "Jack", Num = 7 });

            Item.ItemsSource = list;


我是做了一个多条数据的绑定,当然可以直接赋值

<my:StarsControl x:Name="starts" Number="6" Stars="5" IsComment="True"  Margin="5" ></my:StarsControl>


好了,看看效果

总共显示6颗星,对象的状态为2,3,4,5,6,7 和直接赋值的5,星都是可以更改的 因为IsComment为True嘛,

还有两个事件

 private void StarsControl_ClickMe(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show(((person)((Image)sender).DataContext).Name);  
        }

        private void StarsControl_MoveMe(object sender, MouseEventArgs e)
        {
            MessageBox.Show(((person)((Image)sender).DataContext).Name);  
        } 

加载没错,jack的Num是2,3,4,5,6,7,


上下两张图片的星是不是不一样了,这就是IsComment属性为True 从左向右滑过灰色图片变亮,从右向左滑过时,变灰的效果

这个是ClickMe事件,点击星星时,弹出当前对象的名字

在看IsComment设为false,只展示不能改变星星的状态

我鼠标在6的位置 星星没有变亮...

还有个定义事件应该判断

 public delegate void Click(object sender, MouseButtonEventArgs e);
        public event Click ClickMe; //定义ClickMe事件,在调用此控件时,可以用该事件操作单个星星
        void StarsControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (ClickMe != null)
            {
                ClickMe(sender, e);
            }
        }

MoveMe也一样..............


昨天本来做了一个动画的按钮,有点丑,放上去,又删掉了.....

周末了,大家周末玩的开心..............................................




仿淘宝星星评分效果-纯JS 仿淘宝星星评分效果-纯JS, 立即下载

相关推荐

政府科技管理者如何提升科技成果转化项目进场交易的备案效率?.docx

政府科技管理者如何提升科技成果转化项目进场交易的备案效率?

WPF-22:WPF实现五角星绘制及评级控件

类似淘宝的评级控件在程序业务中使用比较多,尤其是对于电子商务方面的编程。最近做了这样的一个小功能,使用WPF实现。但是对于五角星的绘制部分的代码(包括计算五个点),可以应用于Winform,ASP.NET等。下面来看代码的实现。该项目名称:TestFivePointStarLikeTaobao。这个项目如下图,1、五角星的绘制。绘制五角星,主要是要根据半径获得五个点。 /// &lt;summar...

he91-com 694

TL494充电器原理与维修 (转)

TL494充电器原理与维修 电动自行车充电器多采用开关 电源,型号虽多,但电路结构大同小异,主要区别在于所选的脉宽调制(PWM)芯片不同如(UC3845、UC3842、SG3524、TL494)。现以佳腾牌 充电器为例,介绍其原理和故障检修方法。 一、电路原理 根据实物测绘的佳腾牌充电器电路原理如图1所示。整机可分为PWM产生和推动电路、功 率开关变换电路、...

weixin_30500663的博客 1815

Silverlight开发入门篇:(一)起步

缘起    由于最近做一个Web界面需要用Silverlight,因此自己看了一些相关的知识。在这里与大家分享,写的不好尽管抛砖哈。您的砖头是我进步的阶梯:)    我会把学习的心得,技巧放在这里,期望把它做成一个系列(之后把这句话删掉,嘻嘻)。    有交流的朋友可以发到这个邮箱:v-xxu@microsoft.com

Coding Crazy 小组的专栏 967

YOLOv5添加注意力机制的具体步骤

本文主要介绍了 本文在此篇博客的基础上向YOLOv5-5.0版 本文主要包括以下内容一、CBAM注意力机制添加(1)修改yolov5s主干网络(2)在common.py中添加可调用的CBAM模块(3)向yolo.py文件添加CBAMC3判断语句二、SE注意力机制添加 本文以yolov5s网络为例 一、CBAM注意力机制添加 注意力机制可以添加在backbone,Neck,Head等部分,接下来本文以backbone主干网络为例 (1)修改yolov5s主干网络 1.在yolov5-5.0工程文件夹下,找到m

thy0000的博客 2万+

OpenClaw + Ollama 本地大模型部署教程:彻底告别Token焦虑

OpenClaw + Ollama 本地大模型部署教程:彻底告别Token焦虑

leaning_java的博客 1229

使用Silverlight Toolkit 等级控件---Rating

     乍一看到这个控件,就让我想起了电影里的“悬赏缉拿”的海报。在头像下面有一排星,根据实心星的数目来标识该罪犯的‘危险程度’。其实在一些电影网站上也有对某部片子打星的功能。而在Silverlight Toolkit 3就是真的提供了这么一个控件,通过它可以很方便的实现这一功能。      下面就简要介绍一下其用法。         首先,我们要在项目中添加对System.Windows.C...

weixin_34056162的博客 156

告别降级CUDA!手把手教你为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly + vLLM推理环境

本文详细指导如何为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly和vLLM推理环境,特别针对CUDA 12.8的适配问题提供解决方案。从硬件准备到源码编译,再到模型部署与性能调优,手把手教你构建高效AI推理系统。

weixin_33724046的博客 409

自定义silverlight控件

自定义silverlight控件 silverlight 自定义控件基础篇(仿淘宝评论星级控件) Silverlight/WPF 自定义控件的数据绑定问题 SL项目开发自定义控件封装之新建自定义控件类库

cdefg198的专栏 647

触摸屏蓝牙控制

使用杰理芯片通过蓝牙实现触摸屏功能,需要结合触摸屏数据采集、蓝牙数据传输以及移动端应用的实现。

m0_46145044的博客 1109

使用lighttpd和开发板进行交互

本文介绍了如何在嵌入式开发板上使用Lighttpd Web服务器实现硬件交互功能。主要内容包括:Lighttpd通过CGI程序间接控制硬件的基本原理;lighttpd.conf配置文件的详细解析;开发板文件目录结构设计;用C语言编写控制GPIO的CGI程序示例;网页调用CGI实现按钮触发控制的HTML代码;常见问题调试建议。最后通过效果图展示了网页按钮点击后成功控制LED灯的实际效果,验证了Lighttpd+CGI方案在嵌入式设备Web控制中的可行性。

m0_49476241的博客 1426

分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日)

分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日) 本周Silverlight学习资源更新: Silverlight Tools 4安装时的错误提示 happy_0812 Silverlight

Kevin Fan 2268

【人工智能】Spring AI项目在定义 `response_format` 的 Invalid schema for response_format ‘custom_schema‘

确保。

奶爸的编程之路,也就一周冷个三天 562
上一篇: 自定义silverlight控件
下一篇: Quartz.NET(作业调度框架) 学习笔记(一)【了解作业调度框架】
黄瓜黄瓜
博客等级 码龄15年 27粉丝 12原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值