Minor improvements for TextBlocks
This commit is contained in:
parent
e31c40b659
commit
6648d318ca
|
@ -19,7 +19,7 @@ public static class Flow
|
||||||
var arrow = Enumerable.Repeat(arrowChar, width).Join();
|
var arrow = Enumerable.Repeat(arrowChar, width).Join();
|
||||||
|
|
||||||
// note : appending "fake label" below to make it vertically symmetric
|
// note : appending "fake label" below to make it vertically symmetric
|
||||||
return TextBlock.CenterHorizontal(label, arrow, "");
|
return TextBlock.AlignCenterHorizontal(label, arrow, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
[SuppressMessage("ReSharper", "PossibleMultipleEnumeration")]
|
[SuppressMessage("ReSharper", "PossibleMultipleEnumeration")]
|
||||||
|
@ -35,6 +35,6 @@ public static class Flow
|
||||||
.Concat(halfArrow)
|
.Concat(halfArrow)
|
||||||
.ToArray(height / 2 * 2 + 1);
|
.ToArray(height / 2 * 2 + 1);
|
||||||
|
|
||||||
return TextBlock.CenterHorizontal(lines);
|
return TextBlock.AlignCenterHorizontal(lines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,13 +34,12 @@ internal static class Program
|
||||||
private const UInt32 UpdateIntervalSeconds = 2;
|
private const UInt32 UpdateIntervalSeconds = 2;
|
||||||
|
|
||||||
private static readonly Byte[] BatteryNodes = { 2, 3, 4, 5, 6 };
|
private static readonly Byte[] BatteryNodes = { 2, 3, 4, 5, 6 };
|
||||||
private const String BatteryTty = "/dev/ttyUSB0";
|
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("localhost", 5001);
|
private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("localhost", 5001);
|
||||||
private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("localhost", 5002);
|
private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("localhost", 5002);
|
||||||
private static readonly TcpChannel GridMeterChannel = new TcpChannel("localhost", 5003);
|
private static readonly TcpChannel GridMeterChannel = new TcpChannel("localhost", 5003);
|
||||||
private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("localhost", 5004);
|
private static readonly TcpChannel IslandBusLoadChannel = new TcpChannel("localhost", 5004);
|
||||||
private static readonly TcpChannel AmptChannel = new TcpChannel("localhost", 5005);
|
private static readonly TcpChannel AmptChannel = new TcpChannel("localhost", 5005);
|
||||||
private static readonly TcpChannel RelaysChannel = new TcpChannel("localhost", 5006);
|
private static readonly TcpChannel RelaysChannel = new TcpChannel("localhost", 5006);
|
||||||
private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007);
|
private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007);
|
||||||
|
@ -49,7 +48,7 @@ internal static class Program
|
||||||
private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("10.0.2.1", 502); // "192.168.1.2";
|
private static readonly TcpChannel TruConvertAcChannel = new TcpChannel("10.0.2.1", 502); // "192.168.1.2";
|
||||||
private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("10.0.3.1", 502); // "192.168.1.3";
|
private static readonly TcpChannel TruConvertDcChannel = new TcpChannel("10.0.3.1", 502); // "192.168.1.3";
|
||||||
private static readonly TcpChannel GridMeterChannel = new TcpChannel("10.0.4.1", 502); // "192.168.1.241";
|
private static readonly TcpChannel GridMeterChannel = new TcpChannel("10.0.4.1", 502); // "192.168.1.241";
|
||||||
private static readonly TcpChannel AcOutLoadChannel = new TcpChannel("10.0.4.2", 502); // "192.168.1.241";
|
private static readonly TcpChannel IslandBusLoadChannel = new TcpChannel("10.0.4.2", 502); // "192.168.1.241";
|
||||||
private static readonly TcpChannel AmptChannel = new TcpChannel("10.0.5.1", 502); // "192.168.1.249";
|
private static readonly TcpChannel AmptChannel = new TcpChannel("10.0.5.1", 502); // "192.168.1.249";
|
||||||
private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007);
|
private static readonly TcpChannel BatteriesChannel = new TcpChannel("localhost", 5007);
|
||||||
#endif
|
#endif
|
||||||
|
@ -88,14 +87,14 @@ internal static class Program
|
||||||
var sdNotifyReturn = sd_notify(0, "READY=1");
|
var sdNotifyReturn = sd_notify(0, "READY=1");
|
||||||
|
|
||||||
var battery48TlDevices = BatteryNodes
|
var battery48TlDevices = BatteryNodes
|
||||||
.Select(n => new Battery48TlDevice(BatteryTty, n))
|
.Select(n => new Battery48TlDevice(BatteriesChannel, n))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var batteryDevices = new Battery48TlDevices(battery48TlDevices);
|
var batteryDevices = new Battery48TlDevices(battery48TlDevices);
|
||||||
var acDcDevices = new TruConvertAcDcDevices(TruConvertAcChannel);
|
var acDcDevices = new TruConvertAcDcDevices(TruConvertAcChannel);
|
||||||
var dcDcDevices = new TruConvertDcDcDevices(TruConvertDcChannel);
|
var dcDcDevices = new TruConvertDcDcDevices(TruConvertDcChannel);
|
||||||
var gridMeterDevice = new EmuMeterDevice(GridMeterChannel);
|
var gridMeterDevice = new EmuMeterDevice(GridMeterChannel);
|
||||||
var acIslandLoadMeter = new EmuMeterDevice(AcOutLoadChannel);
|
var acIslandLoadMeter = new EmuMeterDevice(IslandBusLoadChannel);
|
||||||
var amptDevice = new AmptDevices(AmptChannel);
|
var amptDevice = new AmptDevices(AmptChannel);
|
||||||
var saliMaxRelaysDevice = new RelaysDevice(RelaysChannel);
|
var saliMaxRelaysDevice = new RelaysDevice(RelaysChannel);
|
||||||
|
|
||||||
|
@ -240,7 +239,7 @@ internal static class Program
|
||||||
.Select(s1 => s1.Status.Ac.Power)
|
.Select(s1 => s1.Status.Ac.Power)
|
||||||
.ToArray());
|
.ToArray());
|
||||||
|
|
||||||
var dcLinkVoltage = TextBlock.CenterHorizontal("",
|
var dcLinkVoltage = TextBlock.AlignCenterHorizontal("",
|
||||||
s.DcDc.Dc.Link.Voltage.ToDisplayString(),
|
s.DcDc.Dc.Link.Voltage.ToDisplayString(),
|
||||||
"");
|
"");
|
||||||
|
|
||||||
|
@ -249,11 +248,11 @@ internal static class Program
|
||||||
// Voltage Measurement Values
|
// Voltage Measurement Values
|
||||||
//var inverterVoltage = new Voltage [(Int32)s.AcDc.Ac.L1.Voltage, (Int32)s.AcDc.Ac.L2.Voltage, (Int32)s.AcDc.Ac.L3.Voltage];
|
//var inverterVoltage = new Voltage [(Int32)s.AcDc.Ac.L1.Voltage, (Int32)s.AcDc.Ac.L2.Voltage, (Int32)s.AcDc.Ac.L3.Voltage];
|
||||||
//var dcLinkVoltage = s.DcDc.Dc.Link.Voltage;
|
//var dcLinkVoltage = s.DcDc.Dc.Link.Voltage;
|
||||||
var dc48Voltage = s.DcDc.Dc.Battery.Voltage.ToDisplayString();
|
var dc48Voltage = s.DcDc.Dc.Battery.Voltage;
|
||||||
var batteryVoltage = s.Battery.Dc.Voltage.ToDisplayString;
|
var batteryVoltage = s.Battery.Dc.Voltage;
|
||||||
var batterySoc = s.Battery.Soc.ToDisplayString();
|
var batterySoc = s.Battery.Soc;
|
||||||
var batteryCurrent = s.Battery.Dc.Current.ToDisplayString();
|
var batteryCurrent = s.Battery.Dc.Current;
|
||||||
var batteryTemp = s.Battery.Temperature.ToDisplayString();
|
var batteryTemp = s.Battery.Temperature;
|
||||||
|
|
||||||
var gridBusColumn = ColumnBox("Pv", "Grid Bus", "Load" , gridVoltageByPhase , gridLoadPower);
|
var gridBusColumn = ColumnBox("Pv", "Grid Bus", "Load" , gridVoltageByPhase , gridLoadPower);
|
||||||
var islandBusColumn = ColumnBox("Pv", "Island Bus", "Load" , inverterPowerByPhase, islandLoadPower);
|
var islandBusColumn = ColumnBox("Pv", "Island Bus", "Load" , inverterPowerByPhase, islandLoadPower);
|
||||||
|
@ -268,24 +267,25 @@ internal static class Program
|
||||||
var gridBox = TextBlock.AlignLeft(gridPowerByPhase).TitleBox("Grid");
|
var gridBox = TextBlock.AlignLeft(gridPowerByPhase).TitleBox("Grid");
|
||||||
var inverterBox = TextBlock.AlignLeft(inverterPowerByAcDc).TitleBox("Inverter");
|
var inverterBox = TextBlock.AlignLeft(inverterPowerByAcDc).TitleBox("Inverter");
|
||||||
var dcDcBox = TextBlock.AlignLeft(dc48Voltage).TitleBox("DC/DC");
|
var dcDcBox = TextBlock.AlignLeft(dc48Voltage).TitleBox("DC/DC");
|
||||||
var batteryAvgBox = TextBlock.AlignLeft(batteryVoltage,
|
var batteryAvgBox = TextBlock.AlignLeft(batteryVoltage.ToDisplayString(),
|
||||||
batterySoc,
|
batterySoc.ToDisplayString(),
|
||||||
batteryCurrent,
|
batteryCurrent.ToDisplayString(),
|
||||||
batteryTemp)
|
batteryTemp.ToDisplayString())
|
||||||
.TitleBox("Battery");
|
.TitleBox("Battery");
|
||||||
|
|
||||||
|
|
||||||
//////////////////// Batteries /////////////////////////
|
//////////////////// Batteries /////////////////////////
|
||||||
|
|
||||||
var batteryBoxes = s.Battery
|
IReadOnlyList<TextBlock> batteryBoxes = s.Battery
|
||||||
.Devices
|
.Devices
|
||||||
.Select(CreateIndividualBattery)
|
.Select(CreateIndividualBattery)
|
||||||
.ToArray(s.Battery.Devices.Count);
|
.ToArray(s.Battery.Devices.Count);
|
||||||
|
|
||||||
var individualBatteries = TextBlock.AlignLeft(batteryBoxes);
|
var individualBatteries = batteryBoxes.Any()
|
||||||
|
? TextBlock.AlignLeft(batteryBoxes)
|
||||||
|
: TextBlock.Spacer(1);
|
||||||
|
|
||||||
|
var totalBoxes = TextBlock.AlignCenterVertical(gridBox,
|
||||||
var totalBoxes = TextBlock.CenterVertical(gridBox,
|
|
||||||
gridBusFlow,
|
gridBusFlow,
|
||||||
gridBusColumn,
|
gridBusColumn,
|
||||||
flowGridBusToIslandBus,
|
flowGridBusToIslandBus,
|
||||||
|
@ -316,12 +316,7 @@ internal static class Program
|
||||||
|
|
||||||
var flow = Flow.Horizontal(battery.Dc.Power);
|
var flow = Flow.Horizontal(battery.Dc.Power);
|
||||||
|
|
||||||
return TextBlock.CenterVertical(flow, box);
|
return TextBlock.AlignCenterVertical(flow, box);
|
||||||
}
|
|
||||||
|
|
||||||
private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox)
|
|
||||||
{
|
|
||||||
return ColumnBox(pvTitle, busTitle, loadTitle, dataBox, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox, ActivePower loadPower)
|
private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox, ActivePower loadPower)
|
||||||
|
@ -331,13 +326,13 @@ internal static class Program
|
||||||
|
|
||||||
private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox, ActivePower loadPower, ActivePower pvPower)
|
private static TextBlock ColumnBox(String pvTitle, String busTitle, String loadTitle, TextBlock dataBox, ActivePower loadPower, ActivePower pvPower)
|
||||||
{
|
{
|
||||||
var pvBox = TextBlock.AlignLeft("").TitleBox(pvTitle);
|
var pvBox = TextBlock.FromString(pvTitle).Box();
|
||||||
var pvToBus = Flow.Vertical(pvPower);
|
var pvToBus = Flow.Vertical(pvPower);
|
||||||
var busBox = TextBlock.AlignLeft(dataBox).TitleBox(busTitle);
|
var busBox = TextBlock.AlignLeft(dataBox).TitleBox(busTitle);
|
||||||
var busToLoad = Flow.Vertical(loadPower);
|
var busToLoad = Flow.Vertical(loadPower);
|
||||||
var loadBox = TextBlock.AlignLeft("").TitleBox(loadTitle);
|
var loadBox = TextBlock.FromString(loadTitle).Box();
|
||||||
|
|
||||||
return TextBlock.CenterHorizontal(pvBox, pvToBus, busBox, busToLoad, loadBox);
|
return TextBlock.AlignCenterHorizontal(pvBox, pvToBus, busBox, busToLoad, loadBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<T?> ResultOrNull<T>(this Task<T> task)
|
private static async Task<T?> ResultOrNull<T>(this Task<T> task)
|
||||||
|
|
|
@ -1,82 +1,5 @@
|
||||||
|
|
||||||
namespace InnovEnergy.Lib.Utils;
|
namespace InnovEnergy.Lib.Utils;
|
||||||
|
|
||||||
// public class TextBlock
|
|
||||||
// {
|
|
||||||
// public static TextBlock Empty { get; } = new TextBlock(Array.Empty<String>());
|
|
||||||
//
|
|
||||||
// public IReadOnlyList<String> Lines { get; }
|
|
||||||
//
|
|
||||||
// public Int32 Width => Lines.Count == 0
|
|
||||||
// ? 0
|
|
||||||
// : Lines.Max(l=>l.Length);
|
|
||||||
//
|
|
||||||
// public Int32 Height => Lines.Count;
|
|
||||||
//
|
|
||||||
// public TextBlock(IReadOnlyList<String> lines) => Lines = lines;
|
|
||||||
//
|
|
||||||
// public TextBlock AlignLeft (Int32 width = -1) => AlignHorizontal((l, w) => l.PadRight(w), width);
|
|
||||||
// public TextBlock AlignRight (Int32 width = -1) => AlignHorizontal((l, w) => l.PadLeft(w), width);
|
|
||||||
// public TextBlock AlignHCenter(Int32 width = -1) => AlignHorizontal((l, w) => l.PadLeft((w + l.Length) / 2).PadRight(w), width);
|
|
||||||
//
|
|
||||||
// public TextBlock AlignTop (Int32 height) => Lines.Concat(EmptyLines(height)).Take(height).ToArray(height);
|
|
||||||
// public TextBlock AlignBottom (Int32 height) => EmptyLines(Lines.Count - height).Concat(Lines).Take(height).ToArray(height);
|
|
||||||
// //public TextBlock AlignVCenter(Int32 height) => EmptyLines(height/2).Concat(Lines).Take(height).ToArray(height);
|
|
||||||
// //public TextBlock AlignVCenter(Int32 height) => AlignHorizontal((l, w) => l.PadLeft((w + l.Length) / 2).PadRight(w), width);
|
|
||||||
//
|
|
||||||
// private static IEnumerable<String> EmptyLines(Int32 height)
|
|
||||||
// {
|
|
||||||
// return height > 0
|
|
||||||
// ? Enumerable.Repeat("", height)
|
|
||||||
// : Enumerable.Empty<String>();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// public static TextBlock HSpace(Int32 width ) => new TextBlock(new []{"".PadRight(width)});
|
|
||||||
// public static TextBlock VSpace(Int32 height) => new TextBlock(Enumerable.Repeat("", height).ToArray(height));
|
|
||||||
//
|
|
||||||
// public static TextBlock Space(Int32 width, Int32 height)
|
|
||||||
// {
|
|
||||||
// var lines = Enumerable
|
|
||||||
// .Repeat("".PadRight(width), height)
|
|
||||||
// .ToArray(height);
|
|
||||||
//
|
|
||||||
// return new TextBlock(lines);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// private TextBlock AlignHorizontal(Func<String, Int32, String> alignLine, Int32 width = -1)
|
|
||||||
// {
|
|
||||||
// if (!Lines.Any())
|
|
||||||
// return Empty;
|
|
||||||
//
|
|
||||||
// var strings = Lines
|
|
||||||
// .SelectMany(GetLines)
|
|
||||||
// .ToList();
|
|
||||||
//
|
|
||||||
// width = width < 0 ? strings.Max(l => l.Length) : width;
|
|
||||||
//
|
|
||||||
// var aligned = strings
|
|
||||||
// .Select(l => l.Length > width ? l.Substring(0, width) : l)
|
|
||||||
// .Select(l => alignLine(l, width))
|
|
||||||
// .ToArray(strings.Count);
|
|
||||||
//
|
|
||||||
// return new TextBlock(aligned);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// private static IReadOnlyList<String> GetLines(Object l)
|
|
||||||
// {
|
|
||||||
// return l is TextBlock tb
|
|
||||||
// ? tb.Lines
|
|
||||||
// : l.ToString()?.SplitLines() ?? new[] { "<null>" };
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public override String ToString() => String.Join(Environment.NewLine, Lines);
|
|
||||||
//
|
|
||||||
// public static implicit operator TextBlock(String[] lines) => new TextBlock(lines);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
public class TextBlock
|
public class TextBlock
|
||||||
{
|
{
|
||||||
private readonly IReadOnlyList<String> _Lines;
|
private readonly IReadOnlyList<String> _Lines;
|
||||||
|
@ -85,8 +8,7 @@ public class TextBlock
|
||||||
|
|
||||||
public override String ToString() => _Lines.JoinLines();
|
public override String ToString() => _Lines.JoinLines();
|
||||||
|
|
||||||
|
public static TextBlock AlignLeft(IReadOnlyList<Object> things)
|
||||||
public static TextBlock AlignLeft(params Object[] things)
|
|
||||||
{
|
{
|
||||||
var lines = things
|
var lines = things
|
||||||
.SelectMany(GetLines)
|
.SelectMany(GetLines)
|
||||||
|
@ -94,12 +16,14 @@ public class TextBlock
|
||||||
|
|
||||||
var width = lines.Max(l => l.Length);
|
var width = lines.Max(l => l.Length);
|
||||||
|
|
||||||
var alignedLines = lines.Select(l => l.PadRight(width)).ToArray(lines.Count);
|
var alignedLines = lines
|
||||||
|
.Select(l => l.PadRight(width))
|
||||||
|
.ToArray(lines.Count);
|
||||||
|
|
||||||
return new TextBlock(alignedLines);
|
return new TextBlock(alignedLines);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TextBlock AlignRight(params Object[] things)
|
public static TextBlock AlignRight(IReadOnlyList<Object> things)
|
||||||
{
|
{
|
||||||
var lines = things
|
var lines = things
|
||||||
.SelectMany(GetLines)
|
.SelectMany(GetLines)
|
||||||
|
@ -107,12 +31,14 @@ public class TextBlock
|
||||||
|
|
||||||
var width = lines.Max(l => l.Length);
|
var width = lines.Max(l => l.Length);
|
||||||
|
|
||||||
var alignedLines = lines.Select(l => l.PadLeft(width)).ToArray(lines.Count);
|
var alignedLines = lines
|
||||||
|
.Select(l => l.PadLeft(width))
|
||||||
|
.ToArray(lines.Count);
|
||||||
|
|
||||||
return new TextBlock(alignedLines);
|
return new TextBlock(alignedLines);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TextBlock CenterHorizontal(IReadOnlyList<Object> things)
|
public static TextBlock AlignCenterHorizontal(IReadOnlyList<Object> things)
|
||||||
{
|
{
|
||||||
var lines = things
|
var lines = things
|
||||||
.SelectMany(GetLines)
|
.SelectMany(GetLines)
|
||||||
|
@ -127,12 +53,9 @@ public class TextBlock
|
||||||
return new TextBlock(alignedLines);
|
return new TextBlock(alignedLines);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TextBlock CenterHorizontal(params Object[] things)
|
|
||||||
{
|
|
||||||
return CenterHorizontal((IReadOnlyList<Object>)things);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static TextBlock AlignTop(params Object[] things)
|
|
||||||
|
public static TextBlock AlignTop(IReadOnlyList<Object> things)
|
||||||
{
|
{
|
||||||
var columns = things
|
var columns = things
|
||||||
.Select(GetLines)
|
.Select(GetLines)
|
||||||
|
@ -149,7 +72,7 @@ public class TextBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static TextBlock AlignBottom(params Object[] things)
|
public static TextBlock AlignBottom(IReadOnlyList<Object> things)
|
||||||
{
|
{
|
||||||
var columns = things
|
var columns = things
|
||||||
.Select(GetLines)
|
.Select(GetLines)
|
||||||
|
@ -166,7 +89,7 @@ public class TextBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static TextBlock CenterVertical(params Object[] things)
|
public static TextBlock AlignCenterVertical(IReadOnlyList<Object> things)
|
||||||
{
|
{
|
||||||
var columns = things
|
var columns = things
|
||||||
.Select(GetLines)
|
.Select(GetLines)
|
||||||
|
@ -182,7 +105,14 @@ public class TextBlock
|
||||||
return new TextBlock(alignedLines);
|
return new TextBlock(alignedLines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static TextBlock AlignLeft (params Object[] things) => AlignLeft ((IReadOnlyList<Object>) things);
|
||||||
|
public static TextBlock AlignRight (params Object[] things) => AlignRight ((IReadOnlyList<Object>) things);
|
||||||
|
public static TextBlock AlignTop (params Object[] things) => AlignTop ((IReadOnlyList<Object>) things);
|
||||||
|
public static TextBlock AlignBottom (params Object[] things) => AlignBottom ((IReadOnlyList<Object>) things);
|
||||||
|
public static TextBlock AlignCenterVertical (params Object[] things) => AlignCenterVertical ((IReadOnlyList<Object>) things);
|
||||||
|
public static TextBlock AlignCenterHorizontal(params Object[] things) => AlignCenterHorizontal((IReadOnlyList<Object>) things);
|
||||||
|
|
||||||
|
public static TextBlock FromString(String thing) => AlignLeft(thing);
|
||||||
|
|
||||||
public TextBlock Box()
|
public TextBlock Box()
|
||||||
{
|
{
|
||||||
|
@ -229,9 +159,6 @@ public class TextBlock
|
||||||
return new TextBlock(lines);
|
return new TextBlock(lines);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static TextBlock Spacer(Int32 n)
|
public static TextBlock Spacer(Int32 n)
|
||||||
{
|
{
|
||||||
return new TextBlock(Enumerable.Repeat("".PadRight(n), n).ToArray(n));
|
return new TextBlock(Enumerable.Repeat("".PadRight(n), n).ToArray(n));
|
||||||
|
|
Loading…
Reference in New Issue