Элемент управления FindByName внутри другого элемента управления на ContentPage в Xamarin

Я хочу установить фокус на SearchBar, когда он появится. Проблема в том, что SearchBar находится внутри всплывающего окна, и мне нужно получить к нему доступ из ViewModel.

Стандартным способом я бы использовал

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

но это уже не работает.

Вот 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>

Вложенный FindByName тоже не работает.

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;

Спасибо

во-первых, вам действительно никогда не нужно использовать FindByName напрямую. Во-вторых, если вы используете MVVM, вам не следует пытаться получить прямой доступ к представлению из виртуальной машины — для этого и нужна привязка данных. Если вы просто пытаетесь установить фокус, это можно сделать в коде позади. SfPopup имеет несколько событий жизненного цикла, которые вы можете использовать для этого.

Jason 19.03.2022 20:54

да, я мог бы использовать событие «Открыто» всплывающего окна, но все же, как получить доступ к окну поиска из этого?

Kalixt 19.03.2022 21:04

Дайте строке поиска x: Name, затем используйте ее в функции «При появлении» кода, стоящего за всплывающим окном.

Amjad S. 20.03.2022 18:13

Это то, что я сделал, но это ноль. private void fro_Popup_NewItem_Opened (отправитель объекта, EventArgs e) { var searchbar = fro_Popup_NewItem.FindByName («fro_SearchBar_NewItem»); панель поиска = this.FindByName("fro_SearchBar_NewItem"); }

Kalixt 20.03.2022 20:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать Задача, чтобы открыть новый поток для завершения этой операции в коде программной части.

Xaml:

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

Код позади:

   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();
        }
    }

Не могли бы вы помочь подтвердить, полезно ли решение для вашего вопроса? Если да, отметьте его как ответ, так как оно полезно для других, кто сталкивается с той же проблемой.

Alexandar May - MSFT 22.03.2022 09:10

да, оф. Я отсутствовал несколько дней.

Kalixt 22.03.2022 12:47

Где я должен поместить этот класс PagePop? Я попытался создать собственный элемент управления, страницу содержимого, на которой размещается всплывающее окно, но ни один из них не работает.

Kalixt 22.03.2022 13:10

Вы, ребята, явно упускаете суть проблемы, я знаю, как получить доступ к элементам управления из кода программной части (страница содержимого). Я не знаю, как получить доступ к элементу управления, который находится внутри другого элемента управления на странице содержимого, в данном случае SearchBar внутри всплывающего окна. Я не могу ссылаться на элементы управления со страницы содержимого, которые размещены внутри всплывающего окна. Я много искал по этой теме, и я не мог найти ничего полезного.

Kalixt 23.03.2022 15:46

Я продвинулся немного вперед, но я еще не в конце. Я мог бы создать страницу XAML для всего всплывающего окна, а затем я могу использовать программный код всплывающего окна для работы с его элементами управления, но у меня есть аргументы в конструкторе PopupPage, и я не могу использовать его таким образом в XAML ContentPage. В нем говорится: тип «PopupPage» не может использоваться в качестве элемента объекта, поскольку он не является общедоступным или не определяет общедоступный конструктор без параметров или преобразователь типов.

Kalixt 23.03.2022 17:15
Ответ принят как подходящий

Кажется, это было не так уж далеко от правильного направления, на самом деле ни один из комментариев.

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;

но я нашел тот, который работает, и мне не нужно создавать отдельный XAML для всплывающего окна.

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);
        }
    }

Спасибо за помощь, всем.

Другие вопросы по теме