У меня проблема с 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 исследует только первый уровень элемента управления, он не работает рекурсивно.
Кто-нибудь может мне помочь?





Такой метод должен подойти.
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();
Я решаю свою проблему со списком, обрабатывая все элементы управления в своем представлении.
List<IVisualTreeElement> listButton = (List<IVisualTreeElement>)numPadGrid.GetVisualTreeDescendants();
foreach (IVisualTreeElement button in listButton)
{
if (button is Button)
{
Button buttonCatch = (Button)button;
ButtonCatch.BorderColor = ColorBorderButton;
}
}
Спасибо за вашу поддержку, но в Мауи я не хочу использовать внешний ресурс