Как реализовать синтаксис.C#

Место общения программистов C#
Ответить
Anonymous
 Как реализовать синтаксис.

Сообщение Anonymous »

Я работаю над проектами WPF и решил создать свое собственное решение для сетки, которое использует строки для ColumnDefinitions и rowdefinitions (как в Avaloniaui). Я использую .net 8. < /p>

Код: Выделить всё

public class FastGrid : Grid
{
private const string Star = "*";
private const char StarChar = '*';
private const string Auto = "Auto";

public static readonly DependencyProperty RowDefinitionsProperty =
DependencyProperty.Register(
nameof(RowDefinitions),
typeof(string),
typeof(FastGrid),
new PropertyMetadata(string.Empty, OnRowDefinitionsChanged));

public static readonly DependencyProperty ColumnDefinitionsProperty =
DependencyProperty.Register(
nameof(ColumnDefinitions),
typeof(string),
typeof(FastGrid),
new PropertyMetadata(string.Empty,  OnColumnDefinitionsChanged));

public new string RowDefinitions
{
get => (string)GetValue(RowDefinitionsProperty);
set => SetValue(RowDefinitionsProperty, value);
}

public new string ColumnDefinitions
{
get => (string)GetValue(ColumnDefinitionsProperty);
set => SetValue(ColumnDefinitionsProperty, value);
}

private static void OnRowDefinitionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is FastGrid grid && e.NewValue is string definitions)
grid.ParseRowDefinitions(definitions);
}

private static void OnColumnDefinitionsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is FastGrid grid && e.NewValue is string definitions)
grid.ParseColumnDefinitions(definitions);
}

private void ParseRowDefinitions(string definitions)
{
base.RowDefinitions.Clear();
if (string.IsNullOrWhiteSpace(definitions)) return;

foreach (var  definition in definitions.Split(','))
{
var trimmed = definition.Trim();
if (string.IsNullOrEmpty(trimmed)) continue;

var row = new RowDefinition
{
Height = GetGridLength(trimmed)
};

base.RowDefinitions.Add(row);
}
}

private void ParseColumnDefinitions(string definitions)
{
base.ColumnDefinitions.Clear();
if (string.IsNullOrWhiteSpace(definitions)) return;

foreach (var definition in definitions.Split(','))
{
var trimmed = definition.Trim();
if (string.IsNullOrEmpty(trimmed)) continue;

var column = new ColumnDefinition
{
Width = GetGridLength(trimmed)
};

base.ColumnDefinitions.Add(column);
}
}

private GridLength GetGridLength(string definition)
{
if (definition.Equals(Auto, StringComparison.OrdinalIgnoreCase))
return GridLength.Auto;
if (definition == Star)
return new GridLength(1, GridUnitType.Star);
if (definition[^1] == StarChar)
return GetStarDefinition(definition);
if (double.TryParse(definition, NumberStyles.Any, CultureInfo.InvariantCulture, out var pixelValue))
return new GridLength(pixelValue);
return GridLength.Auto;
}

private GridLength GetStarDefinition(string definition)
{
if (definition == Star)
return GetDefaultStarLength();
var value = definition.TrimEnd(StarChar);
if (double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out var starValue))
return new GridLength(starValue, GridUnitType.Star);
return GetDefaultStarLength();
}

private GridLength GetDefaultStarLength() => new GridLength(1, GridUnitType.Star);

}
Это работает, но он не имеет синтаксис-гигтлигтинг и
автоматическое выполнение, как в avaloniaui


Подробнее здесь: https://stackoverflow.com/questions/797 ... ustom-grid
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»