Как изменить BorderThickness и BorderBrush при входе в MAUIC#

Место общения программистов C#
Ответить
Anonymous
 Как изменить BorderThickness и BorderBrush при входе в MAUI

Сообщение Anonymous »

Я знаю, что по этой теме есть вопросы и ответы, но я не смог найти решения для этого случая.
Я пытаюсь стилизовать элемент управления Entry для Окна. Я хочу изменить визуальные состояния BorderThickness и BorderBrush по умолчанию в обычном, PointerOver и Focused для тем Light и Dark.
После некоторых ответов из Stack Overflow и самой документации мне удалось получить доступ к свойствам, но не для всех необходимых случаев, например: это был бы мой предпочтительный выбор для ясности, но он работает только для обычного режима. Визуальное состояние, поскольку я не могу получить доступ визуальные состояния.

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

GetVisualStateGroups()
возвращает пустую коллекцию, поэтому я не смог протестировать остальную часть кода.
В MauiProgram CreateMauiApp() перед возвратом builder.Build ();:

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

Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping(nameof(Entry), (handler, view) =>
{
#if WINDOWS
var borderThickness = new Microsoft.UI.Xaml.Thickness(0, 0, 0, 1);
var borderBrush = new Microsoft.UI.Xaml.Media.SolidColorBrush(Windows.UI.Color.FromArgb(255, 175, 175, 175));
var pointerOverBorderBrush = new Microsoft.UI.Xaml.Media.SolidColorBrush(Windows.UI.Color.FromArgb(255, 143, 143, 143));

Microsoft.UI.Xaml.Controls.TextBox windowsNativeView = handler.PlatformView;
windowsNativeView.BorderThickness = borderThickness;
windowsNativeView.BorderBrush = borderBrush;

var visualStateGroups = Microsoft.UI.Xaml.VisualStateManager.GetVisualStateGroups(windowsNativeView);

//focused
var focusedAnimationObjects = visualStateGroups
.FirstOrDefault(g => g.Name == "Focused")?
.States.FirstOrDefault(s => s.Name == "Focused")?
.Storyboard?.Children.OfType();

var borderThicknessAnimation = focusedAnimationObjects?
.FirstOrDefault(a => a.GetType().GetProperty("TargetProperty")?.GetValue(a)?.ToString() == "(UIElement.BorderThickness)");

if (borderThicknessAnimation != null)
{
borderThicknessAnimation.KeyFrames.Clear();
borderThicknessAnimation.KeyFrames.Add(new DiscreteObjectKeyFrame()
{
KeyTime = TimeSpan.Zero,
Value = borderThickness
});
}

var borderBrushAnimation = focusedAnimationObjects?
.FirstOrDefault(a => a.GetType().GetProperty("TargetProperty")?.GetValue(a)?.ToString() == "(UIElement.BorderBrush)");

if (borderBrushAnimation != null)
{
borderBrushAnimation.KeyFrames.Clear();
borderBrushAnimation.KeyFrames.Add(new DiscreteObjectKeyFrame()
{
KeyTime = TimeSpan.Zero,
Value = borderBrush
});
}

//pointerover
var pointerOverBorderBrushAnimation = visualStateGroups
.FirstOrDefault(g => g.Name == "PointerOver")?
.States.FirstOrDefault(s => s.Name == "PointerOver")?
.Storyboard?.Children.OfType()?
.FirstOrDefault(a =>  a.GetType().GetProperty("TargetProperty")?.GetValue(a)?.ToString() == "(UIElement.BorderBrush)");

if (pointerOverBorderBrushAnimation != null)
{
pointerOverBorderBrushAnimation.KeyFrames.Clear();
pointerOverBorderBrushAnimation.KeyFrames.Add(new DiscreteObjectKeyFrame()
{
KeyTime = TimeSpan.Zero,
Value = pointerOverBorderBrush
});
}
#endif
});
Я также пробовал более простые подходы, такие как подписка на GetFocus, GotFocus, LosingFocus, LostFocus, FocusEngaged , FocusDisengaged, FocusChanged, PointerEntered и PointerExited собственного представления () и изменил BorderThickness и BorderBrush, но это не имело никакого значения.
Например, изменение приведенного выше значения на следующее не приводит к изменению измените визуальное состояние «В фокусе»:

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

var borderThickness = new Microsoft.UI.Xaml.Thickness(0, 0, 0, 1);
var borderBrush = new Microsoft.UI.Xaml.Media.SolidColorBrush(Windows.UI.Color.FromArgb(255, 175, 175, 175));
var pointerOverBorderBrush = new Microsoft.UI.Xaml.Media.SolidColorBrush(Windows.UI.Color.FromArgb(255, 143, 143, 143));

Microsoft.UI.Xaml.Controls.TextBox windowsNativeView = handler.PlatformView;
windowsNativeView.BorderThickness = borderThickness;
windowsNativeView.BorderBrush = borderBrush;

windowsNativeView.GotFocus += (s, e) =>
{
windowsNativeView.BorderThickness = borderThickness;
windowsNativeView.BorderBrush = borderBrush;
};
PS: изменяя состояние фокуса в этом случае, я просто хочу удалить толстое синее подчеркивание, приведенный выше код должен сохранить тот же стиль, но с фокусом и не сфокусировано.

Тогда можно использовать менее предпочтительный подход: удалить приведенный выше код и изменить Platforms/Windows/App.xaml, включив в него:< /p>

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



0,0,0,1


0,0,0,1


Работает для одной темы. Я пытался включить ThemeDictionaries со светлыми и темными клавишами, пробовал несколько другие вещи, чтобы изменить тему в WinUI, но на этом этапе я потерял все попытки.
В заключение, для первого примера, можем ли мы получить доступ и изменить свойства границы нативного посмотреть на различные визуальные состояния? И я считаю, что должен быть более простой ответ: как я могу изменить тему в части кода WinUI? особенно для этих свойств, которые кажутся черной магией (я считаю, что они просто переопределяют системные идентификаторы этих свойств, но все же)

Ссылки
ТАКОЙ ответ, который заложил основу для работы
. Документация по обработчикам Net Maui
Библиотека стилей Microsoft, из которой я получил «волшебный» xaml ключи
Разная ссылка, отличный ответ SO, но это создание совершенно нового элемента управления с полноценными обработчиками и всем этим, мой вопрос в надежде избежать всего этого, у меня есть 1< /strong> Запись в моем приложении.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ry-in-maui
Ответить

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

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

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

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

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