自定义silverlight控件

自定义silverlight控件,第1张

概述首先,为什么需要自定义控件 一,项目中重复使用的控件,一处构造,处处使用,方便,简洁。 二,项目整体风格,当然用Style也能控制整个项目的风格,但个人认为用自定义控件,更容易做到,只需要改控件风格,就能让整个项目的风格改变。 三,特殊功能,在项目中往往控件库的控件满足不了需求,这时就需要自己动手,做出一些特殊功能的控件。 四,结构清晰,比如说,在项目中我们布局,是上标题,下类容,常规做法,是用控

首先,为什么需要自定义控件

一,项目中重复使用的控件,一处构造,处处使用,方便,简洁。

二,项目整体风格,当然用Style也能控制整个项目的风格,但个人认为用自定义控件,更容易做到,只需要改控件风格,就能让整个项目的风格改变。

三,特殊功能,在项目中往往控件库的控件满足不了需求,这时就需要自己动手,做出一些特殊功能的控件。

四,结构清晰,比如说,在项目中我们布局,是上标题,下类容,常规做法,是用控件拼成这样的布局,如果封装成控件,则只需要 给Title赋值,在填充类容。

第一节

从简单的TextBlock说起

比如说现在有这样一个需求,一个XAML有许多的TextBlock来显示字符,而这些字符长短不同,使TextBlock宽度不一致,是整个XAML看起来很杂乱,怎么办?

这个问题,首先我们会想,给TextBlock定义固定的长度啊,试想,如果一个字段5个字符,一个字段40个字符,这怎么定义长度,难道定义满足40字符宽度的吗?

首先,定义40字符宽的,不可能,这样5个字符岂不是很浪费空间。

那我们怎么办呢?

首先我们想啊,40和5我们取中间22.5,四舍五入后就是20,如果显示20,那剩下的20怎么办呢。我们是不是可以显示15个字符,然后后面用...代替,用鼠标移上去,在显示全部的字符。

如果这样做

第一种做法,写一个Convert类

  public class TextBlockConvert : IValueConverter  {         #region IValueConverter 成员       public object Convert(object value,Type targettype,object parameter,System.Globalization.CultureInfo culture)        {           return  value.ToString().Length>15?value.ToString().Substring(0,15)+"...":value.ToString();//如果字符长度大于15截取加....                    }        public object ConvertBack(object value,System.Globalization.CultureInfo culture)        {            throw new NotImplementedException();        }        #endregion    }


XAML

 <TextBlock Text="{Binding Info,Converter={StaticResource txtBlockConvert}}" margin="5"></TextBlock>

第二种做法就是改装一下TextBlock,让他帮我们做Convert这件事。

 public partial class StringFromtControl : UserControl    {                     public StringFromtControl()        {            InitializeComponent();        }        public static Readonly DependencyProperty NumberProperty = DependencyProperty.Register("Number",typeof(int),typeof(StringFromtControl),new PropertyMetadata(15,new PropertyChangedCallback(NumbertPropertyChanged)));//注册超过多少字符截取属性,默认超过15个字符,截取加...        public int Number         {            get { return (int)(GetValue(NumberProperty)); }            set { SetValue(NumberProperty,value); }        }        public static voID NumbertPropertyChanged(DependencyObject obj,DependencyPropertyChangedEventArgs args)        {            StringFromtControl sf = (StringFromtControl)obj;            sf.Number = (int)args.NewValue;            sf.txt_Context.Text = sf.txt_Context.Text.Length > sf.Number ? sf.txt_Context.Text.Substring(0,sf.Number) : sf.txt_Context.Text;        }        public static Readonly DependencyProperty LabelTextProperty = DependencyProperty.Register("LabelText",typeof(string),new PropertyMetadata(new PropertyChangedCallback(OnLabelTextPropertyChanged)));//定义字符属性        public string LabelText        {            get { return Convert.ToString(GetValue(LabelTextProperty)); }            set { SetValue(LabelTextProperty,value); }        }        public static voID OnLabelTextPropertyChanged(DependencyObject obj,DependencyPropertyChangedEventArgs args)        {            StringFromtControl sf = (StringFromtControl)obj;            string text = args.NewValue.ToString();            sf.txt_Context.Text = text.Length > sf.Number ? text.Substring(0,sf.Number) + "...." : text;//当字符长度超过Number长度时,截取加....        }              /// <summary>        /// 鼠标进去控件时,用tooltip显示字符        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private voID txt_Context_MouseEnter(object sender,MouseEventArgs e)        {            Point p = e.Getposition(canva);             tooltip tool = new tooltip() { Content = (string)GetValue(LabelTextProperty) };                tool.name = "tool";                tool.SetValue(Canvas.ZIndexProperty,1);                canva.Children.Add(tool);                Canvas.Setleft(tool,p.X);                Canvas.Settop(tool,p.Y);                    }        /// <summary>        /// 鼠标离开时,移除tooltip        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private voID txt_Context_MouseLeave(object sender,MouseEventArgs e)        {            if (canva.Findname("tool") != null)             {                canva.Children.Remove((tooltip)canva.Findname("tool"));            }        }    }

xaml

   <Canvas x:name="canva" Height="30" WIDth="100" >      <TextBlock x:name="txt_Context"  Canvas.top="6"  MouseEnter="txt_Context_MouseEnter" VerticalAlignment="Center"   MouseLeave="txt_Context_MouseLeave"></TextBlock> </Canvas>

调用刚封装的TextBlock

   <StackPanel>        <my:StringFromtControl Number="20" LabelText="I Belive you" margin="10"></my:StringFromtControl>        <my:StringFromtControl Number="20" LabelText="I Belive you,I Belive you" margin="10" ></my:StringFromtControl>        <my:StringFromtControl Number="20" LabelText="I Belive you,I Belive you,I Belive you"  margin="10"></my:StringFromtControl>    </StackPanel>

效果



这样子看起来功能好像是实现了,但是第一个本来就没有超过20个字符,它也显示,这不太好...改改

 /// <summary>        /// 鼠标进去控件时,用tooltip显示字符        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private voID txt_Context_MouseEnter(object sender,p.Y);                    }


这个事件的改改,当字符不超过的失守我们不需要Add(tool)

   /// <summary>        /// 鼠标进去控件时,用tooltip显示字符        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private voID txt_Context_MouseEnter(object sender,MouseEventArgs e)        {            if (((string)GetValue(LabelTextProperty)).Length > (int)GetValue(NumberProperty))//当字符超过设定长度时间添加tooltip            {                Point p = e.Getposition(canva);                tooltip tool = new tooltip() { Content = (string)GetValue(LabelTextProperty) };                tool.name = "tool";                tool.SetValue(Canvas.ZIndexProperty,p.Y);            }        }


这样就好了,当字符不超过时,不会显示tooltip。

这是我的第一篇博客,写的不好,欢迎批评,这也是自学..所以有不足之处,忘谅解...以后每天一篇 除特殊情况..

总结

以上是内存溢出为你收集整理的自定义silverlight控件全部内容,希望文章能够帮你解决自定义silverlight控件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1074253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存