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
});
Code: Select all
TextBox
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;
};
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
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.