diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/PropertyGridInternal/PropertyGridView.GridViewEdit.GridViewEditAccessibleObject.cs b/src/System.Windows.Forms/src/System/Windows/Forms/PropertyGridInternal/PropertyGridView.GridViewEdit.GridViewEditAccessibleObject.cs
index aaeae7acc27..3d92ae7290d 100644
--- a/src/System.Windows.Forms/src/System/Windows/Forms/PropertyGridInternal/PropertyGridView.GridViewEdit.GridViewEditAccessibleObject.cs
+++ b/src/System.Windows.Forms/src/System/Windows/Forms/PropertyGridInternal/PropertyGridView.GridViewEdit.GridViewEditAccessibleObject.cs
@@ -2,8 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-#nullable disable
-
using static Interop;
namespace System.Windows.Forms.PropertyGridInternal
@@ -14,11 +12,16 @@ private partial class GridViewEdit
{
protected class GridViewEditAccessibleObject : ControlAccessibleObject
{
- private readonly PropertyGridView propertyGridView;
+ private readonly PropertyGridView _owningPropertyGridView;
+ private readonly TextBoxBaseUiaTextProvider _textProvider;
+ private readonly GridViewEdit _owningGridViewEdit;
public GridViewEditAccessibleObject(GridViewEdit owner) : base(owner)
{
- propertyGridView = owner.psheet;
+ _owningPropertyGridView = owner.psheet;
+ _owningGridViewEdit = owner;
+ _textProvider = new TextBoxBaseUiaTextProvider(owner);
+ UseTextProviders(_textProvider, _textProvider);
}
public override AccessibleStates State
@@ -45,28 +48,28 @@ public override AccessibleStates State
///
/// Indicates the direction in which to navigate.
/// Returns the element in the specified direction.
- internal override UiaCore.IRawElementProviderFragment FragmentNavigate(UiaCore.NavigateDirection direction)
+ internal override UiaCore.IRawElementProviderFragment? FragmentNavigate(UiaCore.NavigateDirection direction)
{
- if (direction == UiaCore.NavigateDirection.Parent && propertyGridView.SelectedGridEntry != null)
+ if (direction == UiaCore.NavigateDirection.Parent && _owningPropertyGridView.SelectedGridEntry != null)
{
- return propertyGridView.SelectedGridEntry.AccessibilityObject;
+ return _owningPropertyGridView.SelectedGridEntry.AccessibilityObject;
}
else if (direction == UiaCore.NavigateDirection.NextSibling)
{
- if (propertyGridView.DropDownButton.Visible)
+ if (_owningPropertyGridView.DropDownButton.Visible)
{
- return propertyGridView.DropDownButton.AccessibilityObject;
+ return _owningPropertyGridView.DropDownButton.AccessibilityObject;
}
- else if (propertyGridView.DialogButton.Visible)
+ else if (_owningPropertyGridView.DialogButton.Visible)
{
- return propertyGridView.DialogButton.AccessibilityObject;
+ return _owningPropertyGridView.DialogButton.AccessibilityObject;
}
}
else if (direction == UiaCore.NavigateDirection.PreviousSibling)
{
- if (propertyGridView.DropDownVisible)
+ if (_owningPropertyGridView.DropDownVisible)
{
- return propertyGridView.DropDownControlHolder.AccessibilityObject;
+ return _owningPropertyGridView.DropDownControlHolder.AccessibilityObject;
}
}
@@ -77,9 +80,9 @@ internal override UiaCore.IRawElementProviderFragment FragmentNavigate(UiaCore.N
/// Gets the top level element.
///
internal override UiaCore.IRawElementProviderFragmentRoot FragmentRoot
- => propertyGridView.AccessibilityObject;
+ => _owningPropertyGridView.AccessibilityObject;
- internal override object GetPropertyValue(UiaCore.UIA propertyID)
+ internal override object? GetPropertyValue(UiaCore.UIA propertyID)
{
switch (propertyID)
{
@@ -99,22 +102,25 @@ internal override object GetPropertyValue(UiaCore.UIA propertyID)
return NativeMethods.WinFormFrameworkId;
case UiaCore.UIA.IsValuePatternAvailablePropertyId:
return IsPatternSupported(UiaCore.UIA.ValuePatternId);
+ case UiaCore.UIA.IsTextPatternAvailablePropertyId:
+ return IsPatternSupported(UiaCore.UIA.TextPatternId);
+ case UiaCore.UIA.IsTextPattern2AvailablePropertyId:
+ return IsPatternSupported(UiaCore.UIA.TextPattern2Id);
}
return base.GetPropertyValue(propertyID);
}
internal override bool IsPatternSupported(UiaCore.UIA patternId)
- {
- if (patternId == UiaCore.UIA.ValuePatternId)
+ => patternId switch
{
- return true;
- }
-
- return base.IsPatternSupported(patternId);
- }
+ UiaCore.UIA.ValuePatternId => true,
+ UiaCore.UIA.TextPatternId => true,
+ UiaCore.UIA.TextPattern2Id => true,
+ _ => base.IsPatternSupported(patternId)
+ };
- internal override UiaCore.IRawElementProviderSimple HostRawElementProvider
+ internal override UiaCore.IRawElementProviderSimple? HostRawElementProvider
{
get
{
@@ -126,7 +132,7 @@ internal override UiaCore.IRawElementProviderSimple HostRawElementProvider
}
}
- public override string Name
+ public override string? Name
{
get
{
@@ -137,7 +143,7 @@ public override string Name
}
else
{
- GridEntry selectedGridEntry = propertyGridView.SelectedGridEntry;
+ GridEntry selectedGridEntry = _owningPropertyGridView.SelectedGridEntry;
if (selectedGridEntry != null)
{
return selectedGridEntry.AccessibilityObject.Name;
@@ -149,12 +155,12 @@ public override string Name
set => base.Name = value;
}
- internal override int[] RuntimeId
+ internal override int[]? RuntimeId
{
get
{
var selectedGridEntryAccessibleRuntimeId =
- propertyGridView?.SelectedGridEntry?.AccessibilityObject?.RuntimeId;
+ _owningPropertyGridView?.SelectedGridEntry?.AccessibilityObject?.RuntimeId;
if (selectedGridEntryAccessibleRuntimeId is null)
{
@@ -179,7 +185,7 @@ internal override bool IsReadOnly
{
get
{
- return !(propertyGridView.SelectedGridEntry is PropertyDescriptorGridEntry propertyDescriptorGridEntry) || propertyDescriptorGridEntry.IsPropertyReadOnly;
+ return !(_owningPropertyGridView.SelectedGridEntry is PropertyDescriptorGridEntry propertyDescriptorGridEntry) || propertyDescriptorGridEntry.IsPropertyReadOnly;
}
}
diff --git a/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/PropertyGridInternal/PropertyGridView.GridViewEdit.GridViewEditAccessibleObjectTests.cs b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/PropertyGridInternal/PropertyGridView.GridViewEdit.GridViewEditAccessibleObjectTests.cs
index f504873a2d6..47e6bf95d36 100644
--- a/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/PropertyGridInternal/PropertyGridView.GridViewEdit.GridViewEditAccessibleObjectTests.cs
+++ b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/PropertyGridInternal/PropertyGridView.GridViewEdit.GridViewEditAccessibleObjectTests.cs
@@ -3,7 +3,9 @@
// See the LICENSE file in the project root for more information.
using System.Drawing;
+using System.Reflection;
using Xunit;
+using static System.Windows.Forms.Control;
using static Interop;
namespace System.Windows.Forms.PropertyGridInternal.Tests
@@ -85,5 +87,56 @@ internal void SetState(int flag, bool value)
SetState((States)flag, value);
}
}
+
+ [WinFormsFact]
+ public void GridViewEditAccessibleObjectt_ctor_default()
+ {
+ using PropertyGrid propertyGrid = new PropertyGrid();
+ PropertyGridView gridView = propertyGrid.TestAccessor().GridView;
+ Type gridViewEditType = typeof(PropertyGridView).GetNestedType("GridViewEdit", BindingFlags.NonPublic);
+ Assert.NotNull(gridViewEditType);
+ TextBox gridViewEdit = (TextBox)Activator.CreateInstance(gridViewEditType, gridView);
+ Type accessibleObjectType = gridViewEditType.GetNestedType("GridViewEditAccessibleObject", BindingFlags.NonPublic);
+ Assert.NotNull(accessibleObjectType);
+ ControlAccessibleObject accessibleObject = (ControlAccessibleObject)Activator.CreateInstance(accessibleObjectType, gridViewEdit);
+ Assert.Equal(gridViewEdit, accessibleObject.Owner);
+ }
+
+ [WinFormsFact]
+ public void GridViewEditAccessibleObjectt_ctor_ThrowsException_IfOwnerIsNull()
+ {
+ using PropertyGrid propertyGrid = new PropertyGrid();
+ PropertyGridView gridView = propertyGrid.TestAccessor().GridView;
+ Type gridViewEditType = typeof(PropertyGridView).GetNestedType("GridViewEdit", BindingFlags.NonPublic);
+ Assert.NotNull(gridViewEditType);
+ TextBox gridViewEdit = (TextBox)Activator.CreateInstance(gridViewEditType, gridView);
+ Type accessibleObjectType = gridViewEditType.GetNestedType("GridViewEditAccessibleObject", BindingFlags.NonPublic);
+ Assert.NotNull(accessibleObjectType);
+ Assert.Throws(() => Activator.CreateInstance(accessibleObjectType, (TextBox)null));
+ }
+
+ [WinFormsTheory]
+ [InlineData((int)UiaCore.UIA.IsTextPatternAvailablePropertyId)]
+ [InlineData((int)UiaCore.UIA.IsTextPattern2AvailablePropertyId)]
+ [InlineData((int)UiaCore.UIA.IsValuePatternAvailablePropertyId)]
+ public void ToolStripTextBoxControlAccessibleObject_GetPropertyValue_PatternsSuported(int propertyID)
+ {
+ using PropertyGrid propertyGrid = new PropertyGrid();
+ PropertyGridView gridView = propertyGrid.TestAccessor().GridView;
+ AccessibleObject accessibleObject = gridView.EditAccessibleObject;
+ Assert.True((bool)accessibleObject.GetPropertyValue((UiaCore.UIA)propertyID));
+ }
+
+ [WinFormsTheory]
+ [InlineData((int)UiaCore.UIA.ValuePatternId)]
+ [InlineData((int)UiaCore.UIA.TextPatternId)]
+ [InlineData((int)UiaCore.UIA.TextPattern2Id)]
+ public void ToolStripTextBoxControlAccessibleObject_IsPatternSupported_PatternsSuported(int patternId)
+ {
+ using PropertyGrid propertyGrid = new PropertyGrid();
+ PropertyGridView gridView = propertyGrid.TestAccessor().GridView;
+ AccessibleObject accessibleObject = gridView.EditAccessibleObject;
+ Assert.True(accessibleObject.IsPatternSupported((UiaCore.UIA)patternId));
+ }
}
}