You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin实现点击按钮删除父级StackLayout的技术问题

解决Xamarin中点击删除按钮移除对应玩家输入项的问题

核心问题

当前代码存在两个关键缺陷:

  • 动态新增的"X"按钮未绑定点击事件,点击无响应
  • DeleteBtn_Clicked方法未实现移除父级StackLayout的逻辑

修复方案与代码修改

1. 给动态创建的删除按钮绑定点击事件

修改AddBtn_Clicked方法,为新增的按钮绑定删除事件处理函数:

public void AddBtn_Clicked(object sender, EventArgs args)
{
    var deleteBtn = new Button() { Text = "X", WidthRequest = 45 };
    deleteBtn.Clicked += DeleteBtn_Clicked; // 绑定点击事件

    var newplayer = new StackLayout
    {
        Orientation = StackOrientation.Horizontal,
        HorizontalOptions = LayoutOptions.Center,
        Children =
        {
            new Entry() { Placeholder = "Player", WidthRequest=300 },
            deleteBtn
        }
    };
    Players.Children.Add(newplayer);
}

2. 实现删除逻辑

在DeleteBtn_Clicked方法中,通过点击的按钮找到其父级布局,再从容器中移除:

public void DeleteBtn_Clicked(object sender, EventArgs args)
{
    // 获取触发事件的按钮
    var deleteBtn = sender as Button;
    if (deleteBtn == null) return;

    // 获取按钮所在的水平StackLayout
    var playerLayout = deleteBtn.Parent as StackLayout;
    if (playerLayout == null) return;

    // 从Players容器中移除该布局
    Players.Children.Remove(playerLayout);
}

3. 初始项验证

XAML中初始的"X"按钮已绑定DeleteBtn_Clicked,无需修改XAML代码,现在初始项和新增项的删除按钮均可正常工作。


完整修改后代码

.xaml文件(无改动)

<ScrollView>
    <StackLayout>
        <Label Text="Enter Players:"></Label>
        <StackLayout x:Name="Players">
            <StackLayout Orientation="Horizontal" HorizontalOptions="Center">
                <Entry Placeholder="Player" WidthRequest="300"/>
                <Button Text="X" WidthRequest="45" Clicked="DeleteBtn_Clicked"></Button>
            </StackLayout>
        </StackLayout>
        <Button VerticalOptions="End" Text="Add Player" Clicked="AddBtn_Clicked"></Button>
    </StackLayout>
</ScrollView>

.xaml.cs文件

public void AddBtn_Clicked(object sender, EventArgs args)
{
    var deleteBtn = new Button() { Text = "X", WidthRequest = 45 };
    deleteBtn.Clicked += DeleteBtn_Clicked;

    var newplayer = new StackLayout
    {
        Orientation = StackOrientation.Horizontal,
        HorizontalOptions = LayoutOptions.Center,
        Children =
        {
            new Entry() { Placeholder = "Player", WidthRequest=300 },
            deleteBtn
        }
    };
    Players.Children.Add(newplayer);
}

public void DeleteBtn_Clicked(object sender, EventArgs args)
{
    var deleteBtn = sender as Button;
    if (deleteBtn == null) return;

    var playerLayout = deleteBtn.Parent as StackLayout;
    if (playerLayout == null) return;

    Players.Children.Remove(playerLayout);
}

内容的提问来源于stack exchange,提问作者Benjamin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:02:54