网站上的中英文切换是怎么做的,大连网站制作优选ls15227,网络策划人,企业网站报价方案模板文章目录 背景效果预览方案设计分析基本布局添加控件自定义属性添加属性值监听获取点数据 全部代码HorizontalLineContent.xamlHorizontalLineContent.xaml.csDirectionAlignment.csContentDirectionAlignment.cs 使用方法 背景
因为项目开发需要#xff0c;要在WPF上绘制TCP… 文章目录 背景效果预览方案设计分析基本布局添加控件自定义属性添加属性值监听获取点数据 全部代码HorizontalLineContent.xamlHorizontalLineContent.xaml.csDirectionAlignment.csContentDirectionAlignment.cs 使用方法 背景
因为项目开发需要要在WPF上绘制TCP的交互过程图所以现在需要一个箭头控件并且在箭头中间还可以加入文字所以开发了这个HorizontalLineContent控件后续可能还要开发垂直版本。 效果预览 方案设计
一开始设计的实现逻辑其实是有两种的 Polygon x 1 Label x 1 然后通过设置层级Index让文本控件覆盖在图形上但是有个致命的缺点就是文本控件不能设置背景颜色为透明色不然图形就会和文字重叠所以没有采用该方案。 Polygon x 2 Label x 1 通过计算Label的渲染宽度然后计算两边图形的点数据然后绘制图形虽然该方案比上一个要繁琐一点但是效果会好很多后面也可以方便扩展其它的属性比如整体旋转、单独图形旋转、单独文字旋转等。
我这里目前只考虑了如下几个要素
直线大小控件颜色这里没有做Text和箭头颜色的分开文本位置箭头方向箭头宽度和高度
核心的几点逻辑是
我分为了两个Polygon去绘制图形一个在左边一个在右边通过设置箭头方向然后确定哪一个Polygon去绘制箭头另一个去绘制直线。文本控件在中间水平居中通过监听自定义控件属性Text的变化然后重新计算文本控件的宽度然后绘制控件的点数据。我这里将控件的Foreground属性绑定在了Polygon的Fill属性上实现图形跟文字一起变色如果需要单独控制文本和图形的颜色可以拆开处理。
分析
基本布局
首先我们肯定是需要一个Label控件对文本内容进行显示其次是需要一个能调整上中下位置的Grid还需要两个Polygon去绘制图形。 所以基本样式就有了
GridGrid.RowDefinitionsRowDefinition HeightAuto/RowDefinitionRowDefinition Height*/RowDefinitionRowDefinition HeightAuto/RowDefinition/Grid.RowDefinitionsPolygon Grid.Row1 x:Namepol_left VerticalAlignmentCenter FillBlack Panel.ZIndex1Polygon.PointsPoint X0 Y0/PointPoint X35 Y0/PointPoint X35 Y4/PointPoint X0 Y4/Point/Polygon.Points/PolygonPolygon Grid.Row1 x:Namepol_right VerticalAlignmentCenter FillBlack Panel.ZIndex1Polygon.PointsPoint X65 Y0/PointPoint X100 Y0/PointPoint X100 Y4/PointPoint X65 Y4/Point/Polygon.Points/PolygonLabel Grid.Row1 x:Nametxt_text FontFamilyConsolas Padding5 0 5 0 VerticalAlignmentCenter HorizontalAlignmentCenter Panel.ZIndex2/Label
/Grid在设计器中的效果如下图 添加控件自定义属性
// 内容
public new object Content
{get { return (string)GetValue(ContentProperty); }set { SetValue(ContentProperty, value); }
}public static new readonly DependencyProperty ContentProperty DependencyProperty.Register(Content, typeof(object), typeof(HorizontalLineContent), new PropertyMetadata(string.Empty));// 箭头方向
public DirectionAlignment Direction
{get { return (DirectionAlignment)GetValue(DirectionProperty); }set { SetValue(DirectionProperty, value); }
}
public static readonly DependencyProperty DirectionProperty DependencyProperty.Register(Direction, typeof(DirectionAlignment), typeof(HorizontalLineContent), new PropertyMetadata(DirectionAlignment.None));// 文本位置
public ContentDirectionAlignment ContentDirection
{get { return (ContentDirectionAlignment)GetValue(ContentDirectionProperty); }set { SetValue(ContentDirectionProperty, value); }
}
public static readonly DependencyProperty ContentDirectionProperty DependencyProperty.Register(ContentDirection, typeof(ContentDirectionAlignment), typeof(HorizontalLineContent), new PropertyMetadata(ContentDirectionAlignment.Center));// 直线宽度
public double LineSize
{get { return (double)GetValue(LineSizeProperty); }set { SetValue(LineSizeProperty, value); }
}
public static readonly DependencyProperty LineSizeProperty DependencyProperty.Register(LineSize, typeof(double), typeof(HorizontalLineContent), new PropertyMetadata(4.0));// 箭头宽度
public double ArrowWidth
{get { return (double)GetValue(ArrowWidthProperty); }set { SetValue(ArrowWidthProperty, value); }
}
public static readonly DependencyProperty ArrowWidthProperty DependencyProperty.Register(ArrowWidth, typeof(double), typeof(HorizontalLineContent), new PropertyMetadata(10.0));// 箭头高度
public double ArrowHeight
{get { return (double)GetValue(ArrowHeightProperty); }set { SetValue(ArrowHeightProperty, value); }
}
public static readonly DependencyProperty ArrowHeightProperty DependencyProperty.Register(ArrowHeight, typeof(double), typeof(HorizontalLineContent), new PropertyMetadata(12.0));添加属性值监听
// 监听整体控件宽度属性变化
ActualWidthPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, typeof(Label));
ActualWidthPropertyDescriptor.AddValueChanged(txt_text, (o, e)
{RefreshUI();
});// 监听文本内容属性变化
ContentPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ContentProperty, typeof(HorizontalLineContent));
ContentPropertyDescriptor.AddValueChanged(this, (o, e)
{RefreshUI();
});// 监听箭头方向属性变化
DirectionPropertyDescriptor DependencyPropertyDescriptor.FromProperty(DirectionProperty, typeof(HorizontalLineContent));
DirectionPropertyDescriptor.AddValueChanged(this, (o, e)
{RefreshUI();
});// 监听文本位置属性变化
ContentDirectionPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ContentDirectionProperty, typeof(HorizontalLineContent));
ContentDirectionPropertyDescriptor.AddValueChanged(this, (o, e)
{RefreshUI();
});// 监听直线宽度属性变化
LineSizePropertyDescriptor DependencyPropertyDescriptor.FromProperty(LineSizeProperty, typeof(HorizontalLineContent));
LineSizePropertyDescriptor.AddValueChanged(this, (o, e)
{RefreshUI();
});// 监听箭头高度属性变化
ArrowHeightPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ArrowHeightProperty, typeof(HorizontalLineContent));
ArrowHeightPropertyDescriptor.AddValueChanged(this, (o, e)
{RefreshUI();
});// 监听箭头宽度属性变化
ArrowWidthPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ArrowWidthProperty, typeof(HorizontalLineContent));
ArrowWidthPropertyDescriptor.AddValueChanged(this, (o, e)
{RefreshUI();
});获取点数据
public ListPoint GetPoints(DirectionAlignment direction, double left, double mid_left, double mid_right, double right)
{var points new ListPoint();if (ContentDirection ! ContentDirectionAlignment.Center ContentDirection ! ContentDirectionAlignment.None){mid_left mid_right this.ActualWidth / 2.0;}var mid_width this.ActualWidth / 2.0;var lineSize LineSize 1 ? 1 : LineSize;var arrowWidth ArrowWidth 5 ? 5 : ArrowWidth;var arrowHeight ArrowHeight 6 ? 6 : ArrowHeight;if (arrowHeight lineSize){arrowHeight lineSize;}var lineSize_0 0; // 0var lineSize_1 arrowHeight / 2.0 - lineSize / 2.0; // 4var lineSize_2 arrowHeight / 2.0; // 6var lineSize_3 arrowHeight / 2.0 lineSize / 2.0; // 8var lineSize_4 arrowHeight; // 12switch (direction){case DirectionAlignment.None:// Left Pointspoints.Add(new Point(0, lineSize_0));points.Add(new Point(mid_left, lineSize_0));points.Add(new Point(mid_left, lineSize));points.Add(new Point(0, lineSize));// Right Pointspoints.Add(new Point(mid_right, lineSize_0));points.Add(new Point(right, lineSize_0));points.Add(new Point(right, lineSize));points.Add(new Point(mid_right, lineSize));break;case DirectionAlignment.Left:// Left Pointspoints.Add(new Point(mid_left, lineSize_1));points.Add(new Point(arrowWidth, lineSize_1));points.Add(new Point(arrowWidth, lineSize_0));points.Add(new Point(0, lineSize_2));points.Add(new Point(arrowWidth, lineSize_4));points.Add(new Point(arrowWidth, lineSize_3));points.Add(new Point(mid_left, lineSize_3));// Right Pointspoints.Add(new Point(mid_right, lineSize_0));points.Add(new Point(right, lineSize_0));points.Add(new Point(right, lineSize));points.Add(new Point(mid_right, lineSize));break;case DirectionAlignment.Right:// Left Pointspoints.Add(new Point(0, lineSize_0));points.Add(new Point(mid_left, lineSize_0));points.Add(new Point(mid_left, lineSize));points.Add(new Point(0, lineSize));// Right Pointspoints.Add(new Point(mid_right, lineSize_1));points.Add(new Point(right - arrowWidth, lineSize_1));points.Add(new Point(right - arrowWidth, lineSize_0));points.Add(new Point(right, lineSize_2));points.Add(new Point(right - arrowWidth, lineSize_4));points.Add(new Point(right - arrowWidth, lineSize_3));points.Add(new Point(mid_right, lineSize_3));break;}return points;
}全部代码
共4个文件
HorizontalLineContent.xaml
Window x:ClassWpfApp3.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:localclr-namespace:WpfApp3mc:Ignorabled FontFamily微软雅黑TitleMainWindow Height450 Width1024StackPanel Margin20GridTextBlock Grid.Row0 HorizontalAlignmentLeft Text客户端/TextBlockTextBlock Grid.Row0 HorizontalAlignmentRight Text服务端/TextBlock/Gridlocal:HorizontalLineContent ContentDirectionTopLeft LineSize2 ArrowHeight6 ArrowWidth5 DirectionRight Content文本位置【Top】直线宽度【2】箭头方向【None(默认)】/local:HorizontalLineContentlocal:HorizontalLineContent Margin0 20 0 0 LineSize4 ArrowHeight12 ArrowWidth10 DirectionLeft ForegroundRed Content文本位置【None、Center】直线宽度【4(默认)】箭头方向【None】ArrowHeight【12(默认)】ArrowWidth【10(默认)】/local:HorizontalLineContentlocal:HorizontalLineContent Margin0 20 0 0 ContentDirectionBottom DirectionRight ForegroundGreen Content文本位置【Bottom】Foreground【Green】/local:HorizontalLineContentlocal:HorizontalLineContent Margin0 20 0 0 FontSize16 ContentDirectionTopLeft DirectionRightlocal:HorizontalLineContent.ContentStackPanel OrientationHorizontalTextBlock TextAll Default VerticalAlignmentCenter/TextBlockStackPanel Margin10 0 0 0Button Content【ASN.1】/ButtonLine Height5/LineButton Content【证书】/Button/StackPanel/StackPanel/local:HorizontalLineContent.Content/local:HorizontalLineContent/StackPanel
/WindowHorizontalLineContent.xaml.cs
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Shapes;#region 文件版本信息
/** 创建者Zekang Hao* 邮箱adminhaozekang.com* 创建时间2024/6/27 15:11:07* 版本1.0.0.0* 描述HorizontalLineContent.xaml 的交互逻辑*/
#endregionnamespace WpfApp3
{public partial class HorizontalLineContent : UserControl{private DependencyPropertyDescriptor ActualWidthPropertyDescriptor;private DependencyPropertyDescriptor ContentPropertyDescriptor;private DependencyPropertyDescriptor DirectionPropertyDescriptor;private DependencyPropertyDescriptor ContentDirectionPropertyDescriptor;private DependencyPropertyDescriptor LineSizePropertyDescriptor;private DependencyPropertyDescriptor ArrowWidthPropertyDescriptor;private DependencyPropertyDescriptor ArrowHeightPropertyDescriptor;public new object Content{get { return (string)GetValue(ContentProperty); }set { SetValue(ContentProperty, value); }}public static new readonly DependencyProperty ContentProperty DependencyProperty.Register(Content, typeof(object), typeof(HorizontalLineContent), new PropertyMetadata(string.Empty));public DirectionAlignment Direction{get { return (DirectionAlignment)GetValue(DirectionProperty); }set { SetValue(DirectionProperty, value); }}// Using a DependencyProperty as the backing store for Direction. This enables animation, styling, binding, etc...public static readonly DependencyProperty DirectionProperty DependencyProperty.Register(Direction, typeof(DirectionAlignment), typeof(HorizontalLineContent), new PropertyMetadata(DirectionAlignment.None));public ContentDirectionAlignment ContentDirection{get { return (ContentDirectionAlignment)GetValue(ContentDirectionProperty); }set { SetValue(ContentDirectionProperty, value); }}// Using a DependencyProperty as the backing store for TextDirection. This enables animation, styling, binding, etc...public static readonly DependencyProperty ContentDirectionProperty DependencyProperty.Register(ContentDirection, typeof(ContentDirectionAlignment), typeof(HorizontalLineContent), new PropertyMetadata(ContentDirectionAlignment.Center));public double LineSize{get { return (double)GetValue(LineSizeProperty); }set { SetValue(LineSizeProperty, value); }}// Using a DependencyProperty as the backing store for LineSize. This enables animation, styling, binding, etc...public static readonly DependencyProperty LineSizeProperty DependencyProperty.Register(LineSize, typeof(double), typeof(HorizontalLineContent), new PropertyMetadata(4.0));public double ArrowWidth{get { return (double)GetValue(ArrowWidthProperty); }set { SetValue(ArrowWidthProperty, value); }}// Using a DependencyProperty as the backing store for ArrowWidth. This enables animation, styling, binding, etc...public static readonly DependencyProperty ArrowWidthProperty DependencyProperty.Register(ArrowWidth, typeof(double), typeof(HorizontalLineContent), new PropertyMetadata(10.0));public double ArrowHeight{get { return (double)GetValue(ArrowHeightProperty); }set { SetValue(ArrowHeightProperty, value); }}// Using a DependencyProperty as the backing store for ArrowHeight. This enables animation, styling, binding, etc...public static readonly DependencyProperty ArrowHeightProperty DependencyProperty.Register(ArrowHeight, typeof(double), typeof(HorizontalLineContent), new PropertyMetadata(12.0));public HorizontalLineContent(){this.DataContext this;InitializeComponent();txt_text.SetBinding(Label.ContentProperty,new Binding{Path new PropertyPath(nameof(Content)),UpdateSourceTrigger UpdateSourceTrigger.PropertyChanged,Mode BindingMode.OneWay});txt_text.SetBinding(ForegroundProperty,new Binding{Path new PropertyPath(nameof(Foreground)),UpdateSourceTrigger UpdateSourceTrigger.PropertyChanged,Mode BindingMode.OneWay});pol_left.SetBinding(Polygon.FillProperty,new Binding{Path new PropertyPath(nameof(Foreground)),UpdateSourceTrigger UpdateSourceTrigger.PropertyChanged,Mode BindingMode.OneWay});pol_right.SetBinding(Polygon.FillProperty,new Binding{Path new PropertyPath(nameof(Foreground)),UpdateSourceTrigger UpdateSourceTrigger.PropertyChanged,Mode BindingMode.OneWay});ActualWidthPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, typeof(Label));ActualWidthPropertyDescriptor.AddValueChanged(txt_text, (o, e) {RefreshUI();});ContentPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ContentProperty, typeof(HorizontalLineContent));ContentPropertyDescriptor.AddValueChanged(this, (o, e) {RefreshUI();});DirectionPropertyDescriptor DependencyPropertyDescriptor.FromProperty(DirectionProperty, typeof(HorizontalLineContent));DirectionPropertyDescriptor.AddValueChanged(this, (o, e) {RefreshUI();});ContentDirectionPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ContentDirectionProperty, typeof(HorizontalLineContent));ContentDirectionPropertyDescriptor.AddValueChanged(this, (o, e) {RefreshUI();});LineSizePropertyDescriptor DependencyPropertyDescriptor.FromProperty(LineSizeProperty, typeof(HorizontalLineContent));LineSizePropertyDescriptor.AddValueChanged(this, (o, e) {RefreshUI();});ArrowHeightPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ArrowHeightProperty, typeof(HorizontalLineContent));ArrowHeightPropertyDescriptor.AddValueChanged(this, (o, e) {RefreshUI();});ArrowWidthPropertyDescriptor DependencyPropertyDescriptor.FromProperty(ArrowWidthProperty, typeof(HorizontalLineContent));ArrowWidthPropertyDescriptor.AddValueChanged(this, (o, e) {RefreshUI();});}private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e){RefreshUI();}private void RefreshUI(){if (pol_left null || pol_right null || txt_text null){return;}double control_middle this.ActualWidth / 2.0;double txt_width_middle txt_text.ActualWidth / 2.0;double mid_left control_middle - txt_width_middle;double mid_right control_middle txt_width_middle;if (Direction ! DirectionAlignment.None ContentDirection ContentDirectionAlignment.Center){if (mid_left 10){pol_left.Visibility Visibility.Collapsed;pol_right.Visibility Visibility.Collapsed;}else{pol_left.Visibility Visibility.Visible;pol_right.Visibility Visibility.Visible;}}switch (ContentDirection){case ContentDirectionAlignment.None:case ContentDirectionAlignment.Center:txt_text.Padding new Thickness(0, 0, 0, 0);txt_text.SetValue(Grid.RowProperty, 1);break;case ContentDirectionAlignment.Top:case ContentDirectionAlignment.TopLeft:case ContentDirectionAlignment.TopRight:if (Direction DirectionAlignment.None){txt_text.Padding new Thickness(0, 0, 0, 4);}else{txt_text.Padding new Thickness(0, 0, 0, 0);}txt_text.SetValue(Grid.RowProperty, 0);break;case ContentDirectionAlignment.Bottom:case ContentDirectionAlignment.BottomLeft:case ContentDirectionAlignment.BottomRight:if (Direction DirectionAlignment.None){txt_text.Padding new Thickness(0, 4, 0, 0);}else{txt_text.Padding new Thickness(0, 0, 0, 0);}txt_text.SetValue(Grid.RowProperty, 2);break;}switch (ContentDirection){case ContentDirectionAlignment.TopLeft:case ContentDirectionAlignment.BottomLeft:txt_text.HorizontalAlignment HorizontalAlignment.Left;break;case ContentDirectionAlignment.TopRight:case ContentDirectionAlignment.BottomRight:txt_text.HorizontalAlignment HorizontalAlignment.Right;break;default:txt_text.HorizontalAlignment HorizontalAlignment.Center;break;}pol_left.Points.Clear();pol_right.Points.Clear();var points GetPoints(Direction, 0, mid_left, mid_right, this.ActualWidth);if (Direction DirectionAlignment.None){for ( int i 0; i 4; i){pol_left.Points.Add(points[i]);}for ( int i 4; i 8; i){pol_right.Points.Add(points[i]);}}else if (Direction DirectionAlignment.Left){for (int i 0; i 7; i){pol_left.Points.Add(points[i]);}for (int i 7; i 11; i){pol_right.Points.Add(points[i]);}}else if(Direction DirectionAlignment.Right){for (int i 0; i 4; i){pol_left.Points.Add(points[i]);}for (int i 4; i 11; i){pol_right.Points.Add(points[i]);}}}public ListPoint GetPoints(DirectionAlignment direction, double left, double mid_left, double mid_right, double right){var points new ListPoint();if (ContentDirection ! ContentDirectionAlignment.Center ContentDirection ! ContentDirectionAlignment.None){mid_left mid_right this.ActualWidth / 2.0;}var mid_width this.ActualWidth / 2.0;var lineSize LineSize 1 ? 1 : LineSize;var arrowWidth ArrowWidth 5 ? 5 : ArrowWidth;var arrowHeight ArrowHeight 6 ? 6 : ArrowHeight;if (arrowHeight lineSize){arrowHeight lineSize;}var lineSize_0 0; // 0var lineSize_1 arrowHeight / 2.0 - lineSize / 2.0; // 4var lineSize_2 arrowHeight / 2.0; // 6var lineSize_3 arrowHeight / 2.0 lineSize / 2.0; // 8var lineSize_4 arrowHeight; // 12switch (direction){case DirectionAlignment.None:// Left Pointspoints.Add(new Point(0, lineSize_0));points.Add(new Point(mid_left, lineSize_0));points.Add(new Point(mid_left, lineSize));points.Add(new Point(0, lineSize));// Right Pointspoints.Add(new Point(mid_right, lineSize_0));points.Add(new Point(right, lineSize_0));points.Add(new Point(right, lineSize));points.Add(new Point(mid_right, lineSize));break;case DirectionAlignment.Left:// Left Pointspoints.Add(new Point(mid_left, lineSize_1));points.Add(new Point(arrowWidth, lineSize_1));points.Add(new Point(arrowWidth, lineSize_0));points.Add(new Point(0, lineSize_2));points.Add(new Point(arrowWidth, lineSize_4));points.Add(new Point(arrowWidth, lineSize_3));points.Add(new Point(mid_left, lineSize_3));// Right Pointspoints.Add(new Point(mid_right, lineSize_0));points.Add(new Point(right, lineSize_0));points.Add(new Point(right, lineSize));points.Add(new Point(mid_right, lineSize));break;case DirectionAlignment.Right:// Left Pointspoints.Add(new Point(0, lineSize_0));points.Add(new Point(mid_left, lineSize_0));points.Add(new Point(mid_left, lineSize));points.Add(new Point(0, lineSize));// Right Pointspoints.Add(new Point(mid_right, lineSize_1));points.Add(new Point(right - arrowWidth, lineSize_1));points.Add(new Point(right - arrowWidth, lineSize_0));points.Add(new Point(right, lineSize_2));points.Add(new Point(right - arrowWidth, lineSize_4));points.Add(new Point(right - arrowWidth, lineSize_3));points.Add(new Point(mid_right, lineSize_3));break;}return points;}}
}DirectionAlignment.cs
#region 文件版本信息
/** 创建者Zekang Hao* 邮箱adminhaozekang.com* 创建时间2024/6/27 17:01:16* 版本1.0.0.0* 描述*/
#endregionnamespace WpfApp3
{/// summary/// 描述/// /summarypublic enum DirectionAlignment{None,Left,Right,}
}ContentDirectionAlignment.cs
#region 文件版本信息
/** 创建者Zekang Hao* 邮箱adminhaozekang.com* 创建时间2024/6/28 11:17:07* 版本1.0.0.0* 描述*/
#endregionnamespace WpfApp3
{/// summary/// 描述/// /summarypublic enum ContentDirectionAlignment{None,Top,Center,Bottom,TopLeft,TopRight,BottomLeft,BottomRight,}
}
使用方法
Window x:ClassWpfApp3.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:localclr-namespace:WpfApp3mc:Ignorabled FontFamily微软雅黑TitleMainWindow Height450 Width1024StackPanel Margin20GridTextBlock Grid.Row0 HorizontalAlignmentLeft Text客户端/TextBlockTextBlock Grid.Row0 HorizontalAlignmentRight Text服务端/TextBlock/Gridlocal:HorizontalLineContent ContentDirectionTopLeft LineSize2 ArrowHeight6 ArrowWidth5 DirectionRight Content文本位置【Top】直线宽度【2】箭头方向【None(默认)】/local:HorizontalLineContentlocal:HorizontalLineContent Margin0 20 0 0 LineSize4 ArrowHeight12 ArrowWidth10 DirectionLeft ForegroundRed Content文本位置【None、Center】直线宽度【4(默认)】箭头方向【None】ArrowHeight【12(默认)】ArrowWidth【10(默认)】/local:HorizontalLineContentlocal:HorizontalLineContent Margin0 20 0 0 ContentDirectionBottom DirectionRight ForegroundGreen Content文本位置【Bottom】Foreground【Green】/local:HorizontalLineContentlocal:HorizontalLineContent Margin0 20 0 0 FontSize16 ContentDirectionTopLeft DirectionRightlocal:HorizontalLineContent.ContentStackPanel OrientationHorizontalTextBlock TextAll Default VerticalAlignmentCenter/TextBlockStackPanel Margin10 0 0 0Button Content【ASN.1】/ButtonLine Height5/LineButton Content【证书】/Button/StackPanel/StackPanel/local:HorizontalLineContent.Content/local:HorizontalLineContent/StackPanel
/Window