Home > OS >  FindByName control inside another control on ContentPage in Xamarin
FindByName control inside another control on ContentPage in Xamarin

Time:03-24

I want to set focus on SearchBar when he appears. The problem is that SearchBar is placed inside of popup view and I need to access him from ViewModel.

In standard way I would use

Xamarin.Forms.SearchBar tmp_SearchBar = this.Page.FindByName("fro_SearchBar_NewItem") as Xamarin.Forms.SearchBar;

but that's not working anymore.

Here is XAML

<sfPopup:SfPopupLayout x:Name="fro_Popup_NewItem" Opened="fro_Popup_NewItem_Opened" Grid.Row="1" HorizontalOptions="Center" VerticalOptions="Center" BackgroundColor="Black">
    <sfPopup:SfPopupLayout.PopupView>
        <sfPopup:PopupView  BackgroundColor="Black" WidthRequest ="400" HeightRequest ="100" ShowFooter="False" ShowHeader="False">
            <sfPopup:PopupView.ContentTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <!--Search bar-->
                        <Grid Grid.Row="0" HorizontalOptions="Center" VerticalOptions="Center">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>

                                <SearchBar  x:Name="fro_SearchBar_NewItem"
                                            Grid.Column="0"
                                            Text="{Binding SearchText_Popup, Mode=TwoWay}"
                                            SearchCommand="{Binding SearchCommand}"
                                            Placeholder="Find" 
                                            CancelButtonColor="White" 
                                            TextColor="White" 
                                            PlaceholderColor="Gray"/>

                        </Grid>
                  </Grid>
                 </DataTemplate>
            </sfPopup:PopupView.ContentTemplate>
        </sfPopup:PopupView>
    </sfPopup:SfPopupLayout.PopupView>
</sfPopup:SfPopupLayout>

Nested FindByName doesn't work either.

Syncfusion.XForms.PopupLayout.SfPopupLayout tmp_Popup = _Page.FindByName("fro_Popup_NewItem") as Syncfusion.XForms.PopupLayout.SfPopupLayout;
Xamarin.Forms.SearchBar tmp_SearchBar = tmp_Popup.FindByName("fro_SearchBar_NewItem") as Xamarin.Forms.SearchBar;

Thanks

CodePudding user response:

You can use Task to open a new thread to complete this operation in code-behind.

Xaml:

  <SearchBar  x:Name="fro_SearchBar_NewItem" Placeholder="...." BackgroundColor="White"/>

Code behind:

   public partial class PagePop : Popup
   {
        public PagePop()
        {
             InitializeComponent();
             Task.Run(() => myTask());//Create and start the thread
        }
        private void myTask()
        {
            Thread.Sleep(300);
            fro_SearchBar_NewItem.Focus();
        }
    }

CodePudding user response:

It seems that this wasn't so far from right direction, neither of the comments actually.

Syncfusion.XForms.PopupLayout.SfPopupLayout tmp_Popup = _Page.FindByName("fro_Popup_NewItem") as Syncfusion.XForms.PopupLayout.SfPopupLayout;
Xamarin.Forms.SearchBar tmp_SearchBar = tmp_Popup.FindByName("fro_SearchBar_NewItem") as Xamarin.Forms.SearchBar;

but I found the one which works and I don't have to create separate XAML for Popup.

private void fro_Popup_NewItem_Opened(object sender, EventArgs e)
    {
        try
        {
            var nativeObject = (object)fro_Popup_NewItem.GetType().GetRuntimeProperties().FirstOrDefault(x => x.Name.Equals("NativeObject")).GetValue(fro_Popup_NewItem);
            var formsPopupviewContentTemplate = nativeObject.GetType().GetRuntimeFields().FirstOrDefault(x => x.Name.Equals("formsPopupViewContentTemplate")).GetValue(nativeObject);
            var SearchBar = (formsPopupviewContentTemplate as Grid).FindByName<SearchBar>("fro_SearchBar_NewItem");
            SearchBar?.Focus();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

Thanks for help, everyone.

  • Related