Есть ли способ в .NET MAUI переключать состояние флажка при нажатии метки рядом с ним? Например:
<?xml version = "1.0" encoding = "utf-8" ?>
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
x:Class = "MyApp.Views.Test"
Title = "Test">
<HorizontalStackLayout>
<CheckBox />
<Label Text = "Check this box" VerticalOptions = "Center" />
</HorizontalStackLayout>
</ContentPage>
прикрепите распознаватель жестов к метке, которая будет переключать флажок





Вы можете использовать его так: Label и CheckBox.
Дайте флажку имя.
<Label
Text = "Check this box"
FontSize = "32"
HorizontalOptions = "Center" >
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped = "TapGestureRecognizer_Tapped"
NumberOfTapsRequired = "1" />
</Label.GestureRecognizers>
</Label>
<CheckBox x:Name = "StackO" />
Затем для Label Tap
private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
if (StackO.IsChecked )
StackO.IsChecked = false;
else
StackO.IsChecked = true;
}
Ну в основном вам нужно сделать что-то вроде этого:
<ContentView
Padding = "10,20">
<ContentView.GestureRecognizers>
<TapGestureRecognizer Command = "{Binding SomeThingTappedCommand}" />
</ContentView.GestureRecognizers>
<StackLayout Orientation = "Horizontal">
<Label
HorizontalOptions = "StartAndExpand"
InputTransparent = "True"
Text = "Some Title"
VerticalTextAlignment = "Center" />
<controls:ExtendedCheckBox
InputTransparent = "True"
IsChecked = "{Binding IsChecked}"
VerticalOptions = "Center"
Color = "{DynamicResource PrimaryColor}" />
</StackLayout>
</pan:PancakeView>
А затем в вашей виртуальной машине все, что вам нужно сделать, это:
SomeThingTappedCommand = new Command(() => IsChecked = !IsChecked);
Где IsChecked является уведомляемым свойством:
private bool isChecked;
public bool IsChecked
{
get => isChecked;
set => SetProperty(ref isChecked, value);
}
Удачи
Мое решение было основано на этом ответе в конце. Окончательный код можно найти здесь.
В xamarin-файле:
<StackLayout Orientation = "Horizontal">
<CheckBox x:Name = "myCheckBox"
IsChecked = "{Binding IsChecked,Mode=TwoWay}">
</CheckBox>
<Label VerticalTextAlignment = "Center" Text = "Test">
<Label.GestureRecognizers>
<TapGestureRecognizer Tapped = "Clicked"/>
</Label.GestureRecognizers>
</Label>
</StackLayout>
И в коде позади:
private void Clicked(object sender, EventArgs e)
{
myCheckBox.IsChecked = !myCheckBox.IsChecked;
}
//xmal
<HorizontalStackLayout>
<HorizontalStackLayout.GestureRecognizers>
<TapGestureRecognizer Tapped = "TapGestureRecognizer_Tapped"/>
</HorizontalStackLayout.GestureRecognizers>
<CheckBox IsChecked = "True" VerticalOptions = "Center" />
<Label Text = "Hello" VerticalOptions = "Center" />
</HorizontalStackLayout>
//xaml.cs
private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
{
var layout = sender as Layout;
var check = layout.FirstOrDefault(c => c.GetType() == typeof(CheckBox));
if (check != null)
{
((CheckBox)check).IsChecked = !((CheckBox)check).IsChecked;
}
}
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Решение состоит из двух частей. 1) Напишите команду, которая запускается при нажатии на метку. 2) В коде С# этой команды установите свойство флажка IsChecked программно. Исследуйте эти две темы.