CPF/CPF/Controls/DocumentBlock.cs
2023-11-21 23:05:03 +08:00

213 lines
7.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using CPF.Documents;
using CPF.Drawing;
namespace CPF.Controls
{
/// <summary>
/// 简单的文档控件,支持图片字体控件等元素布局,支持每个字符设置样式
/// </summary>
[Description("简单的文档控件,支持图片字符控件等元素布局,支持每个字符设置样式")]
public class DocumentBlock : UIElement, IDocumentStyle
{
/// <summary>
/// 背景填充
/// </summary>
[UIPropertyMetadata(null, UIPropertyOptions.AffectsRender)]
public ViewFill Background
{
get { return (ViewFill)GetValue(); }
set { SetValue(value); }
}
/// <summary>
/// 字体名称
/// </summary>
[UIPropertyMetadata("宋体", UIPropertyOptions.AffectsRender | UIPropertyOptions.Inherits)]
public string FontFamily
{
get { return GetValue<string>(); }
set { SetValue(value); }
}
/// <summary>
/// 字体尺寸
/// </summary>
[UIPropertyMetadata(12f, UIPropertyOptions.AffectsRender | UIPropertyOptions.AffectsMeasure | UIPropertyOptions.Inherits)]
public float FontSize
{
get { return GetValue<float>(); }
set { SetValue(value); }
}
/// <summary>
/// 字体样式
/// </summary>
[UIPropertyMetadata(FontStyles.Regular, UIPropertyOptions.AffectsRender | UIPropertyOptions.AffectsMeasure | UIPropertyOptions.Inherits)]
public FontStyles FontStyle
{
get { return GetValue<FontStyles>(); }
set { SetValue(value); }
}
/// <summary>
/// 前景色
/// </summary>
[UIPropertyMetadata(typeof(ViewFill), "Black", UIPropertyOptions.AffectsRender | UIPropertyOptions.Inherits)]
public ViewFill Foreground
{
get { return (ViewFill)GetValue(); }
set { SetValue(value); }
}
/// <summary>
/// 表示一个文本修饰,它是可添加到文本的视觉装饰(如下划线)。字符串格式: overline/Underline/Strikethrough/none [width[,Solid/Dash/Dot/DashDot/DashDotDot]] [color]
/// </summary>
[UIPropertyMetadata(typeof(TextDecoration), "none", UIPropertyOptions.AffectsRender)]
public TextDecoration TextDecoration
{
get { return (TextDecoration)GetValue(); }
set { SetValue(value); }
}
/// <summary>
/// 获取或设置显示的文本如果设置Document里的内容了Text属性值不会自动变化
/// </summary>
[UIPropertyMetadata("", UIPropertyOptions.AffectsMeasure)]
public string Text
{
get { return GetValue<string>(); }
set { SetValue(value); }
}
Document document;
public Document Document
{
get
{
if (document == null)
{
document = new Document(this);
}
return document;
}
}
/// <summary>
/// 样式
/// </summary>
[NotCpfProperty]
public Collection<DocumentStyle> Styles
{
get { return Document.Styles; }
}
[PropertyChanged(nameof(Text))]
void RegisterText(object newValue, object oldValue, PropertyMetadataAttribute attribute)
{
Document.Children.Clear();
if (newValue != null)
{
Document.Add(newValue.ToString());
}
}
//protected override void OnPropertyChanged(string propertyName, object oldValue, object newValue, PropertyMetadataAttribute propertyMetadata)
//{
// if (propertyName == nameof(Text))
// {
// Document.Children.Clear();
// if (newValue != null)
// {
// Document.Add(newValue.ToString());
// }
// }
// base.OnPropertyChanged(propertyName, oldValue, newValue, propertyMetadata);
//}
protected override Size MeasureOverride(in Size availableSize)
{
//var size = base.MeasureOverride(availableSize);
if (document != null)
{
using (var font = new Font(FontFamily, FontSize, FontStyle))
{
//var w = Width;
//if (!w.IsAuto && w.Unit == Unit.Default && MaxWidth.IsAuto && MinWidth.IsAuto)
//{
// document.Arrange(font, availableSize);
// return document.Size;
//}
document.Arrange(font, availableSize);
//if (document.WordWarp)
//{
// document.IsMeasureValid = false;
//}
return document.Size;
}
}
return base.MeasureOverride(availableSize);
}
protected override Size ArrangeOverride(in Size finalSize)
{
if (document != null)
{
//var rect = GetArrangeRect(finalSize);
using (var font = new Font(FontFamily, FontSize, FontStyle))
{
//document.Arrange(font, finalSize);
foreach (var child in document.UIContainers)
{
child.UIElement.Arrange(new Rect(child.ActualPositon, new Size(child.Width, child.Height)));
}
//if (document.WordWarp)
//{
// if (Height.IsAuto && (MarginTop.IsAuto || MarginBottom.IsAuto))
// {
// return new Size(finalSize.Width, document.Size.Height);
// }
//}
return finalSize;
}
}
return base.ArrangeOverride(finalSize);
}
protected override void OnRender(DrawingContext dc)
{
//using (SolidColorBrush sb = new SolidColorBrush(Color.Black))
//{
// dc.DrawRectangle(sb, new Stroke(1), new Rect(new Point(1, 1), new Size(ActualSize.Width - 3, ActualSize.Height - 3)));
//}
var back = Background;
var size = ActualSize;
if (back != null && size.Width > 0 && size.Height > 0)
{
using (var b = back.CreateBrush(new Rect(new Point(), size), Root.RenderScaling))
{
dc.FillRectangle(b, new Rect(0, 0, size.Width, size.Height));
}
}
//base.OnRender(dc);
if (document != null)
{
document.Render(dc, new Rect(new Point(), size));
}
}
//protected override void OnMouseEnter(MouseEventArgs e)
//{
// base.OnMouseEnter(e);
//}
protected override void OnOverrideMetadata(OverrideMetadata overridePropertys)
{
base.OnOverrideMetadata(overridePropertys);
overridePropertys.Override(nameof(ClipToBounds), new PropertyMetadataAttribute(true)); overridePropertys.Override(nameof(IsAntiAlias), new UIPropertyMetadataAttribute(true, UIPropertyOptions.AffectsRender));
}
}
}