diff --git a/src/Controls/src/Core/HandlerImpl/Application/Application.Impl.cs b/src/Controls/src/Core/HandlerImpl/Application/Application.Impl.cs index 37311146584c..f7edda731a9d 100644 --- a/src/Controls/src/Core/HandlerImpl/Application/Application.Impl.cs +++ b/src/Controls/src/Core/HandlerImpl/Application/Application.Impl.cs @@ -76,7 +76,7 @@ internal void RemoveWindow(Window window) if (window is Element windowElement) { var oldIndex = InternalChildren.IndexOf(windowElement); - InternalChildren.Remove(windowElement); + InternalChildren.RemoveAt(oldIndex); windowElement.Parent = null; OnChildRemoved(windowElement, oldIndex); } diff --git a/src/Controls/src/Core/ListView.cs b/src/Controls/src/Core/ListView.cs index 5cafdb6de2b8..9f687578af82 100644 --- a/src/Controls/src/Core/ListView.cs +++ b/src/Controls/src/Core/ListView.cs @@ -456,10 +456,12 @@ protected override void UnhookContent(Cell content) { base.UnhookContent(content); - if (content == null || !_logicalChildren.Contains(content)) + if (content == null) return; var index = _logicalChildren.IndexOf(content); - _logicalChildren.Remove(content); + if (index == -1) + return; + _logicalChildren.RemoveAt(index); content.Parent = null; VisualDiagnostics.OnChildRemoved(this, content, index); diff --git a/src/Controls/src/Core/Shell/Shell.cs b/src/Controls/src/Core/Shell/Shell.cs index 11c59fd788b5..9846b7c3a04a 100644 --- a/src/Controls/src/Core/Shell/Shell.cs +++ b/src/Controls/src/Core/Shell/Shell.cs @@ -713,11 +713,11 @@ public void RemoveLogicalChild(Element element) element.Parent = null; - if (!_logicalChildren.Contains(element)) + var oldLogicalIndex = _logicalChildren.IndexOf(element); + if (oldLogicalIndex == -1) return; - var oldLogicalIndex = _logicalChildren.IndexOf(element); - _logicalChildren.Remove(element); + _logicalChildren.RemoveAt(oldLogicalIndex); OnChildRemoved(element, oldLogicalIndex); VisualDiagnostics.OnChildRemoved(this, element, oldLogicalIndex); } diff --git a/src/Controls/src/Core/VisualElement.cs b/src/Controls/src/Core/VisualElement.cs index 79a42d7e0951..c80d16fbef04 100644 --- a/src/Controls/src/Core/VisualElement.cs +++ b/src/Controls/src/Core/VisualElement.cs @@ -175,10 +175,12 @@ static void OnTransformChanged(BindableObject bindable, object oldValue, object var transforms = ((string)newValue).Split(' '); foreach (var transform in transforms) { - if (string.IsNullOrEmpty(transform) || transform.IndexOf("(", StringComparison.Ordinal) < 0 || transform.IndexOf(")", StringComparison.Ordinal) < 0) + var openBracket = transform.IndexOf("(", StringComparison.Ordinal); + var closeBracket = transform.IndexOf(")", StringComparison.Ordinal); + if (string.IsNullOrEmpty(transform) || openBracket < 0 || closeBracket < 0) throw new FormatException("Format for transform is 'none | transform(value) [transform(value) ]*'"); - var transformName = transform.Substring(0, transform.IndexOf("(", StringComparison.Ordinal)); - var value = transform.Substring(transform.IndexOf("(", StringComparison.Ordinal) + 1, transform.IndexOf(")", StringComparison.Ordinal) - transform.IndexOf("(", StringComparison.Ordinal) - 1); + var transformName = transform.Substring(0, openBracket); + var value = transform.Substring(openBracket + 1, closeBracket - openBracket - 1); double translationX, translationY, scaleX, scaleY, rotateX, rotateY, rotate; if (transformName.StartsWith("translateX", StringComparison.OrdinalIgnoreCase) && double.TryParse(value, out translationX)) bindable.SetValue(TranslationXProperty, translationX); diff --git a/src/Controls/src/Xaml/TypeArgumentsParser.cs b/src/Controls/src/Xaml/TypeArgumentsParser.cs index 4fc536ba210b..7e730ca6f33d 100644 --- a/src/Controls/src/Xaml/TypeArgumentsParser.cs +++ b/src/Controls/src/Xaml/TypeArgumentsParser.cs @@ -45,9 +45,10 @@ static XmlType Parse(string match, ref string remaining, IXmlNamespaceResolver r IList typeArguments = null; if (isGeneric) { + var openBracket = type.IndexOf("(", StringComparison.Ordinal); typeArguments = ParseExpression( - type.Substring(type.IndexOf("(", StringComparison.Ordinal) + 1, type.LastIndexOf(")", StringComparison.Ordinal) - type.IndexOf("(", StringComparison.Ordinal) - 1), resolver, lineinfo); - type = type.Substring(0, type.IndexOf("(", StringComparison.Ordinal)); + type.Substring(openBracket + 1, type.LastIndexOf(")", StringComparison.Ordinal) - openBracket - 1), resolver, lineinfo); + type = type.Substring(0, openBracket); } var split = type.Split(':'); diff --git a/src/Controls/src/Xaml/XmlTypeXamlExtensions.cs b/src/Controls/src/Xaml/XmlTypeXamlExtensions.cs index 9c823998fee0..df954a47b14c 100644 --- a/src/Controls/src/Xaml/XmlTypeXamlExtensions.cs +++ b/src/Controls/src/Xaml/XmlTypeXamlExtensions.cs @@ -68,8 +68,9 @@ static class XmlTypeXamlExtensions for (var i = 0; i < lookupNames.Count; i++) { var name = lookupNames[i]; - if (name.IndexOf(":", StringComparison.Ordinal) != -1) - name = name.Substring(name.LastIndexOf(':') + 1); + var lastIndex = name.LastIndexOf(':'); + if (lastIndex != -1) + name = name.Substring(lastIndex + 1); if (typeArguments != null) name += "`" + typeArguments.Count; //this will return an open generic Type lookupNames[i] = name; diff --git a/src/Core/src/Handlers/View/ViewHandlerOfT.Windows.cs b/src/Core/src/Handlers/View/ViewHandlerOfT.Windows.cs index 3f871824889e..70d7cfc64056 100644 --- a/src/Core/src/Handlers/View/ViewHandlerOfT.Windows.cs +++ b/src/Core/src/Handlers/View/ViewHandlerOfT.Windows.cs @@ -22,7 +22,8 @@ protected override void SetupContainer() var oldParent = (Panel?)PlatformView.Parent; var oldIndex = oldParent?.Children.IndexOf(PlatformView); - oldParent?.Children.Remove(PlatformView); + if (oldIndex is int idx && idx >= 0) + oldParent?.Children.RemoveAt(oldIndex.Value); ContainerView ??= new WrapperView(); ((WrapperView)ContainerView).Child = PlatformView; @@ -45,7 +46,8 @@ protected override void RemoveContainer() var oldParent = (Panel?)ContainerView.Parent; var oldIndex = oldParent?.Children.IndexOf(ContainerView); - oldParent?.Children.Remove(ContainerView); + if (oldIndex is int idx && idx >= 0) + oldParent?.Children.RemoveAt(oldIndex); CleanupContainerView(ContainerView); ContainerView = null;