Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit 40b3b42

Browse files
authored
Fix multiple events on toolbar items (#12797)
1 parent 06ccda8 commit 40b3b42

File tree

4 files changed

+44
-9
lines changed

4 files changed

+44
-9
lines changed

Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7181.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ protected override void Init()
3131
{
3232
var page = CreateContentPage("Test page");
3333

34-
_toolbarItem = new ToolbarItem(DefaultToolbarItemText, string.Empty, OnToolbarClicked)
34+
_toolbarItem = new ToolbarItem()
3535
{
36-
AutomationId = ToolbarBtn
36+
Text = DefaultToolbarItemText,
37+
AutomationId = ToolbarBtn,
38+
Command = new Command(OnToolbarClicked)
3739
};
3840

3941
page.ToolbarItems.Add(_toolbarItem);
@@ -58,20 +60,20 @@ protected override void Init()
5860
private void OnToolbarClicked() =>
5961
_toolbarItem.Text = $"{AfterClickToolbarItemText} {_clicks++}";
6062

61-
#if UITEST && __ANDROID__
63+
#if UITEST && (__ANDROID__ || __WINDOWS__)
6264
[Test]
6365
public void ShellToolbarItemTests()
6466
{
6567
var count = 0;
6668
var toolbarButton = RunningApp.WaitForElement(ToolbarBtn);
67-
Assert.AreEqual(toolbarButton[0].Text, DefaultToolbarItemText);
69+
Assert.AreEqual(DefaultToolbarItemText, toolbarButton[0].ReadText());
6870

6971
for (int i = 0; i < 5; i++)
7072
{
7173
RunningApp.Tap(ToolbarBtn);
7274

7375
toolbarButton = RunningApp.WaitForElement(ToolbarBtn);
74-
Assert.AreEqual($"{AfterClickToolbarItemText} {count++}", toolbarButton[0].Text);
76+
Assert.AreEqual($"{AfterClickToolbarItemText} {count++}", toolbarButton[0].ReadText());
7577
}
7678

7779
RunningApp.Tap(SetToolbarIconBtn);

Xamarin.Forms.Platform.UAP/AccessibilityExtensions.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,5 +123,16 @@ static string ConcatenateNameAndHint(Element Element)
123123

124124
}
125125

126+
internal static void SetAutomationProperties(
127+
this FrameworkElement frameworkElement,
128+
Element element,
129+
string defaultName = null)
130+
{
131+
frameworkElement.SetAutomationPropertiesAutomationId(element?.AutomationId);
132+
frameworkElement.SetAutomationPropertiesName(element, defaultName);
133+
frameworkElement.SetAutomationPropertiesHelpText(element);
134+
frameworkElement.SetAutomationPropertiesLabeledBy(element);
135+
frameworkElement.SetAutomationPropertiesAccessibilityView(element);
136+
}
126137
}
127138
}

Xamarin.Forms.Platform.UAP/Shell/ShellStyles.xaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@
2828
<StackPanel Orientation="Horizontal" />
2929
</ItemsPanelTemplate>
3030
<DataTemplate x:Key="ShellToolbarItemTemplate">
31-
<xf:ShellToolbarItemRenderer ToolbarItem="{Binding}" Margin="0" Background="Transparent" BorderThickness="1"
32-
IsEnabled="{Binding IsEnabled}" Command="{Binding Command}" CommandParameter="{Binding CommandParameter}">
31+
<xf:ShellToolbarItemRenderer ToolbarItem="{Binding}" Margin="0" Background="Transparent" BorderThickness="1" IsEnabled="{Binding IsEnabled}">
3332
<Grid>
3433
<Grid.ColumnDefinitions>
3534
<ColumnDefinition Width="Auto"></ColumnDefinition>

Xamarin.Forms.Platform.UAP/Shell/ShellToolbarItemRenderer.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ namespace Xamarin.Forms.Platform.UWP
1010
{
1111
public class ShellToolbarItemRenderer : Windows.UI.Xaml.Controls.Button
1212
{
13+
14+
public static readonly DependencyProperty ToolbarItemProperty =
15+
DependencyProperty.Register("ToolbarItem", typeof(ToolbarItem), typeof(ShellToolbarItemRenderer), new PropertyMetadata(null, OnToolbarItemChanged));
16+
17+
static void OnToolbarItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
18+
{
19+
((ShellToolbarItemRenderer)d)
20+
.ToolbarItemChanged(e.OldValue as ToolbarItem, e.NewValue as ToolbarItem);
21+
}
22+
1323
public ShellToolbarItemRenderer()
1424
{
1525
Xamarin.Forms.Shell.VerifyShellUWPFlagEnabled(nameof(ShellToolbarItemRenderer));
@@ -28,7 +38,20 @@ public ToolbarItem ToolbarItem
2838
set { SetValue(ToolbarItemProperty, value); }
2939
}
3040

31-
public static readonly DependencyProperty ToolbarItemProperty =
32-
DependencyProperty.Register("ToolbarItem", typeof(ToolbarItem), typeof(ShellToolbarItemRenderer), new PropertyMetadata(null));
41+
void ToolbarItemChanged(ToolbarItem oldItem, ToolbarItem newItem)
42+
{
43+
if(oldItem != null)
44+
oldItem.PropertyChanged -= ToolbarItemPropertyChanged;
45+
46+
this.SetAutomationProperties(newItem, defaultName: newItem?.Text);
47+
48+
if (newItem != null)
49+
newItem.PropertyChanged += ToolbarItemPropertyChanged;
50+
51+
void ToolbarItemPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
52+
{
53+
this.SetAutomationProperties(newItem, defaultName: newItem?.Text);
54+
}
55+
}
3356
}
3457
}

0 commit comments

Comments
 (0)