wpfRPG游戏卷一用户控件之字体

一.目的

构建如图有描边的文字。

 

 

二.正文

1.QXObject继承属性I:

现实控件的基本布局,从自定义接口QXObject继承实现

 

属性共9个,其中:

X,Y:用户控件左上角坐标(相当于地图);

CenterX,CenterY:用户控件定位点,此处无用,若继承的为精灵则可定位到精灵脚下坐标;

Left,Top,ZIndex:用户控件在父容器,此处为Canvas的X,Y,Z轴距离,实现为:

/// <summary>

        /// 获取或设置层次

        /// </summary>

        public int ZIndex {

            get { return (int)this.GetValue(Canvas.ZIndexProperty); }

            set { this.SetValue(Canvas.ZIndexProperty, value); }

        }

Width_,Height:用户控件宽高。

 

2.基础属性

 

上述8个属性为文字控件基础属性,从命名就可知道用处了,具体声明如下:

/// <summary>

        /// 获取或设置文字是否加粗

        /// </summary>

        public bool Bold {

            get { return (bool)GetValue(BoldProperty); }

            set { SetValue(BoldProperty, value); }

        }

 

        public static readonly DependencyProperty BoldProperty = DependencyProperty.Register(

            "Bold",//注册名

            typeof(bool),//属性类型

            typeof(QXText),//所有者类型

            new FrameworkPropertyMetadata(

                false,//默认值

                FrameworkPropertyMetadataOptions.AffectsRender,//呈现时更改

                new PropertyChangedCallback(QXTextInvalidated),//回调函数

                null

                )

            );

 

3.绘制及重绘方法

上面我们声明了这么多的属性,下面开始写字喽!

写字三步走:

  1. 声明个文字路径

Geometry TextGeometry;

2.重载呈现函数

/// <summary>

        /// 重载控件OnRender

        /// </summary>

        protected override void OnRender(DrawingContext drawingContext) {

            CreateText();

            drawingContext.DrawGeometry(Fill, new Pen(Stroke, StrokeThickness), TextGeometry);

        }

CreateText方法:

/// <summary>

        /// 生成描边文字

        /// </summary>

        public void CreateText() {

            FormattedText formattedText = new FormattedText(

                Text,

                CultureInfo.GetCultureInfo("zh-cn"),

                FlowDirection.LeftToRight,

                new Typeface(Font, Italic ? FontStyles.Italic : FontStyles.Normal, Bold ? FontWeights.Bold : FontWeights.Normal, FontStretches.Normal),

                Size,

                Brushes.Black

                );

            //根据文字创建路径

            TextGeometry = formattedText.BuildGeometry(new Point(0, 0));

            this.MinWidth = formattedText.Width; this.MinHeight = formattedText.Height;

        }

3.回调函数

/// <summary>

        /// 回调重绘

        /// </summary>

        /// <param name="d"></param>

        /// <param name="e"></param>

        private static void QXTextInvalidated(DependencyObject d, DependencyPropertyChangedEventArgs e) {

            ((QXText)d).CreateText();

        }

三.总结

至此用户文字控件完成!

很高兴,很早上看代码学习,晚上总结,大家都知道这是个好习惯,希望自己能坚持下来。

posted @ 2012-07-30 19:41  但,我知道  阅读(304)  评论(0编辑  收藏  举报