So ändern Sie BorderThickness und BorderBrush bei der Eingabe in MAUIC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 So ändern Sie BorderThickness und BorderBrush bei der Eingabe in MAUI

Post by Anonymous »

Ich weiß, dass es zu diesem Thema einige Fragen und Antworten gibt, aber ich konnte für diesen Fall keine Lösung finden.
Ich versuche, das Eingabesteuerelement für Windows. Ich möchte die Standardeinstellungen für BorderThickness und BorderBrush in den visuellen Zuständen „Normal“, „PointerOver“ und „Fokussiert“ für die Themen „Hell“ und „Dunkel“ ändern.
Nach einigen Antworten von Stack Overflow und der Dokumentation selbst gelang es mir, auf die Eigenschaften zuzugreifen, aber nicht in allen erforderlichen Fällen, zum Beispiel:
Aus Gründen der Klarheit wäre dies meine bevorzugte Wahl, aber nur das funktioniert für den normalen visuellen Status, da ich nicht auf die VisualStates zugreifen kann. GetVisualStateGroups() gibt eine leere Sammlung zurück, daher konnte ich den Rest des Codes nicht testen.
In MauiProgram CreateMauiApp() vor der Rückgabe des Builders. Build();:

Code: Select all

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
});
Ich habe auch einfachere Ansätze ausprobiert, wie das Abonnieren von GettingFocus, GotFocus, LosingFocus, LostFocus, FocusEngaged , FocusDisengaged, FocusChanged, PointerEntered und PointerExited der nativen Ansicht (

Code: Select all

TextBox
) und das Ändern von BorderThickness und BorderBrush, aber es hat keinen Unterschied gemacht.
Wenn Sie beispielsweise das Obige in das Folgende ändern, ändert sich nicht der Focused< /code> visueller Zustand:

Code: Select all

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: Indem ich in diesem Fall den fokussierten visuellen Status ändere, möchte ich nur die dicke blaue Unterstreichung entfernen. Der obige Code sollte den gleichen Stil beibehalten, sowohl im fokussierten als auch im unfokussierten Zustand.

Dann ein weniger bevorzugter Ansatz: Entfernen des obigen Codes und Ändern der Platforms/Windows/App.xaml, um Folgendes einzuschließen:< /p>

Code: Select all



0,0,0,1


0,0,0,1


Funktioniert für ein Thema. Ich habe versucht, als ThemeDictionaries mit den Tasten Hell und Dunkel einzubinden, ich habe einige ausprobiert Andere Dinge, um das Thema auf der WinUI zu ändern, aber an diesem Punkt habe ich alle Versuche aus den Augen verloren.
Zusammenfassend lässt sich sagen, dass wir für das erste Beispiel auf die Rahmeneigenschaften des nativen zugreifen und diese ändern können Blick auf die verschiedenen visuellen Zustände? Und was meiner Meinung nach die einfachere Antwort sein sollte: Wie kann ich das Design im WinUI-Teil des Codes ändern? insbesondere für diese Eigenschaften, die wie schwarze Magie erscheinen (ich glaube, es überschreibt nur die System-IDs für diese Eigenschaften, aber immer noch)

Referenzen:
SO Antwort, die den Grundstein gelegt hat
.Net Maui Handlers DocumentationMicrosoft Style-Bibliothek, in der ich das „magische“ XAML habe Schlüssel
Verschiedener Link, tolle SO-Antwort, aber es geht darum, ein völlig neues Steuerelement mit vollwertigen Handlern und all dem zu erstellen. Meine Frage ist in der Hoffnung, all das zu vermeiden, ich habe 1< /strong>Eintrag in meiner App.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post