Как получить доступ ко всем элементам управления в ContentView

У меня проблема с XAML в моем проекте Мауи. Отказ от ответственности: я не эксперт в этой технологии, поэтому, пожалуйста, проявите ко мне немного милосердия ;).

Это мой xaml:

    <ContentView xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class = "ApeEvoPrototype.NumPad">
    <ScrollView>
        <Grid 
            ColumnDefinitions = "{DynamicResource NumPad_GridColumnPrincipale}" 
            RowDefinitions = "{DynamicResource NumPad_GridRowPrincipale}">
            <Frame
                Grid.Row = "0"
                Grid.Column = "0"
                Style = "{DynamicResource NumPad_Frame}">
                <Grid x:Name = "numPadGrid" Style = "{DynamicResource NumPad_GridInterno}">
                    
                    <StackLayout Grid.Row = "0" Grid.ColumnSpan = "3">
                        <Grid x:Name = "containerEditor" Style = "{DynamicResource NumPad_GridLinguetta}">
                            
                            <Label Grid.Column = "0" VerticalTextAlignment = "Center" Text = "Quantity:" TextColor = "Black" />

                            <Editor Grid.Column = "1" x:Name = "txtQuantity" VerticalTextAlignment = "Center" HorizontalTextAlignment = "End"/>

                            <Button Grid.Column = "2" x:Name = "btnBck" Text = "Bck" Clicked = "Button_Clicked_Bck" BindingContext = "2000" />
                        </Grid>

                    </StackLayout>
                    <StackLayout Grid.Column = "0" Grid.Row = "1" Style = "{DynamicResource NumPad_StackTastierino}">
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn1" Style = "{DynamicResource NumPad_Button}" Text = "1" Clicked = "Button_Clicked" BindingContext = "1"/>
                        </Grid>
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn4" Style = "{DynamicResource NumPad_Button}" Text = "4" Clicked = "Button_Clicked" BindingContext = "4"/>
                        </Grid>
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn7" Style = "{DynamicResource NumPad_Button}" Text = "7" Clicked = "Button_Clicked" BindingContext = "7"/>
                        </Grid>
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btnTot" Style = "{DynamicResource NumPad_Button}" Text = "All" Clicked = "Button_Clicked_Tot" BindingContext = "3000" />
                        </Grid>
                    </StackLayout>
                    
                    <StackLayout Grid.Column = "1" Grid.Row = "1" Style = "{DynamicResource NumPad_StackTastierino}">
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn2" Style = "{DynamicResource NumPad_Button}" Text = "2" Clicked = "Button_Clicked" BindingContext = "2"/>
                        </Grid>
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn5" Style = "{DynamicResource NumPad_Button}" Text = "5" Clicked = "Button_Clicked" BindingContext = "5"/>
                        </Grid>
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn8" Style = "{DynamicResource NumPad_Button}" Text = "8" Clicked = "Button_Clicked" BindingContext = "8"/>
                        </Grid>
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn0" Style = "{DynamicResource NumPad_Button}" Text = "0" Clicked = "Button_Clicked" BindingContext = "0"/>
                        </Grid>
                    </StackLayout>

                    <StackLayout Grid.Column = "2" Grid.Row = "1" Style = "{DynamicResource NumPad_StackTastierino}">
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn3" Style = "{DynamicResource NumPad_Button}" Text = "3" Clicked = "Button_Clicked" BindingContext = "3"/>
                        </Grid>
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn6" Style = "{DynamicResource NumPad_Button}" Text = "6" Clicked = "Button_Clicked" BindingContext = "6" />
                        </Grid>
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btn9" Style = "{DynamicResource NumPad_Button}" Text = "9" Clicked = "Button_Clicked" BindingContext = "9"/>
                        </Grid>
                        <Grid Style = "{DynamicResource NumPad_GridTastierino}">
                            <Button x:Name = "btnC" Style = "{DynamicResource NumPad_Button}" Text = "C" Clicked = "Button_Clicked_C" BindingContext = "1000" />
                        </Grid>
                    </StackLayout>

                </Grid>
            </Frame>

        </Grid>
    </ScrollView>
</ContentView>

Как вы видите, у меня есть много кнопок с именами «btn?», Моя цель — получить доступ к этим кнопкам динамически, не используя их имена. Единственный способ, которым я могу это сделать, — определить имя единственной сетки, содержащей кнопку, как я делаю здесь:

    <Grid x:Name = "containerEditor" Style = "{DynamicResource NumPad_GridLinguetta}">

и в моем коде выполните:

var buttons = containerEditor.Children.OfType<Button>();

Таким образом, я могу получить доступ ко всем кнопкам ресурсов в Grid. Проблема с этим подходом заключается в том, что метод Children исследует только первый уровень элемента управления, он не работает рекурсивно.

Кто-нибудь может мне помочь?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
0
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Такой метод должен подойти.

public static IEnumerable<T> FindChildrenOfType<T>(DependencyObject parent) where T : DependencyObject
{
    if (parent is ContentControl contentControl)
    {
        if (contentControl.Content is T contentOfT)
        {
            yield return contentOfT;
        }

        if (contentControl.Content is DependencyObject dependencyObjectContent)
        {
            foreach (T grandChild in FindChildrenOfType<T>(dependencyObjectContent))
            {
                yield return grandChild;
            }
        }
    }
    else
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(parent, i);

            if (child is T childOfT)
            {
                yield return childOfT;
            }

            foreach (T grandChild in FindChildrenOfType<T>(child))
            {
                yield return grandChild;
            }
        }
    }
}

Назовите свой корень, «Root» в этом примере, и используйте его следующим образом:

var buttons = FindChildrenOfType<Button>(this.Root)
    .Where(x => x.Name.StartsWith("btn"))
    .ToList();

Спасибо за вашу поддержку, но в Мауи я не хочу использовать внешний ресурс

Alberto Fagni 11.10.2022 17:35
Ответ принят как подходящий

Я решаю свою проблему со списком, обрабатывая все элементы управления в своем представлении.

List<IVisualTreeElement> listButton = (List<IVisualTreeElement>)numPadGrid.GetVisualTreeDescendants();
foreach (IVisualTreeElement button in listButton)
{
    if (button is Button)
    {
        Button buttonCatch = (Button)button;
        ButtonCatch.BorderColor = ColorBorderButton;
    }
 }

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