【问题标题】:Xamarin forms C# StackLayoutXamarin 形成 C# StackLayout
【发布时间】:2019-11-18 18:30:15
【问题描述】:

请看下面的代码。如果我点击“啤酒”或“烈酒”private void MyButton_Clicked(object sender, EventArgs e) 将被调用。 但是,如果我单击“葡萄酒”或“苹果酒”,则没有任何反应。有人知道这是为什么吗?

 <StackLayout VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand">

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="100"/>
                <RowDefinition Height="100"/>
                <RowDefinition Height="100"/>
            </Grid.RowDefinitions>

            <StackLayout Grid.Row="0" VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand">
                <Button Text="Products" Clicked="Button_Clicked"/>
            </StackLayout>

            <StackLayout x:Name="stack1" Grid.Row="1" Orientation="Vertical" VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand">

            </StackLayout>

            <StackLayout x:Name="stack2" Grid.Row="1" Orientation="Vertical" VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand">

            </StackLayout>

            <StackLayout x:Name="stack3" Grid.Row="1" Orientation="Vertical" VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand">

            </StackLayout>

            <StackLayout x:Name="stack4" Grid.Row="1" Orientation="Vertical" VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand">

            </StackLayout>

        </Grid>

    </StackLayout>




    private void Button_Clicked(object sender, EventArgs e)
    {
        List<MyButton> myButtons = new List<MyButton>() { new MyButton("Beer", MyButton_Clicked), new MyButton("Spirit", MyButton_Clicked), new MyButton("Wine", MyButton_Clicked), new MyButton("Cider", MyButton_Clicked)};

        stack1.Children.Clear();
        stack2.Children.Clear();
        stack3.Children.Clear();

        foreach (MyButton myButton in myButtons)
        {
            stack1.Children.Add(myButton);
        }
    }

    private void MyButton_Clicked(object sender, EventArgs e)
    {
        var mybutton = sender as MyButton;
        var title = mybutton.Text;
        List<MyButton> myButtons = new List<MyButton>();
        string stackList = "";

        if (title == "Beer")
        {
            stack1.Children.Clear();
            stackList = "stack2";
            myButtons = new List<MyButton>() { new MyButton("Beer", MyButton_Clicked), new MyButton("Guinness", MyButton_Clicked), new MyButton("Coors", MyButton_Clicked), new MyButton("Bud", MyButton_Clicked) };
        }
        else if (title == "Spirit")
        {
            stack1.Children.Clear();
            stackList = "stack2";
            myButtons = new List<MyButton>() { new MyButton("Spirit", MyButton_Clicked), new MyButton("Vodka", MyButton_Clicked), new MyButton("Whiskey", MyButton_Clicked), new MyButton("Gin", MyButton_Clicked) };
        }
        else if (title == "Wine")
        {
            stack1.Children.Clear();
            stackList = "stack2";
            myButtons = new List<MyButton>() { new MyButton("Wine", MyButton_Clicked), new MyButton("Bin55", MyButton_Clicked), new MyButton("Hardys", MyButton_Clicked), new MyButton("120", MyButton_Clicked) };
        }
        else if (title == "Cider")
        {
            stack1.Children.Clear();
            stackList = "stack2";
            myButtons = new List<MyButton>() { new MyButton("Cider", MyButton_Clicked), new MyButton("Magners", MyButton_Clicked), new MyButton("Frosty_Jack", MyButton_Clicked) };
        }
        //Second list
        else if (title == "Vodka")
        {
            stack1.Children.Clear();
            stackList = "stack3";
            myButtons = new List<MyButton>() { new MyButton("Spirit", MyButton_Clicked), new MyButton("Vodka", MyButton_Clicked), new MyButton("Smirnoff", MyButton_Clicked), new MyButton("Glens", MyButton_Clicked), new MyButton("Vladivar", MyButton_Clicked) };
        }
        else if (title == "Whiskey")
        {
            stack1.Children.Clear();
            stackList = "stack3";
            myButtons = new List<MyButton>() { new MyButton("Spirit", MyButton_Clicked), new MyButton("Whiskey", MyButton_Clicked), new MyButton("Jameson", MyButton_Clicked), new MyButton("Bushmills", MyButton_Clicked), new MyButton("Powers", MyButton_Clicked) };
        }
        else if (title == "Gin")
        {
            stack1.Children.Clear();
            stackList = "stack3";
            myButtons = new List<MyButton>() { new MyButton("Spirit", MyButton_Clicked), new MyButton("Gin", MyButton_Clicked), new MyButton("Gordons", MyButton_Clicked), new MyButton("Bombay", MyButton_Clicked), new MyButton("Hendricks's", MyButton_Clicked), new MyButton("Beefeater", MyButton_Clicked) };
        }
        //Next list
        else if (title == "Bin55")
        {
            //myButtons = new List<MyButton>() { new MyButton("Smirnoff", MyButton_Clicked), new MyButton("Glens", MyButton_Clicked), new MyButton("Vladivar", MyButton_Clicked) };
        }
        else if (title == "Hardys")
        {
           // myButtons = new List<MyButton>() { new MyButton("Jameson", MyButton_Clicked), new MyButton("Bushmills", MyButton_Clicked), new MyButton("Powers", MyButton_Clicked) };
        }
        else if (title == "120")
        {
          //  myButtons = new List<MyButton>() { new MyButton("Jameson", MyButton_Clicked), new MyButton("Bushmills", MyButton_Clicked), new MyButton("Powers", MyButton_Clicked) };
        }
        if (stackList == "stack2")
        {
            stack2.Children.Clear();

            foreach (MyButton myButton in myButtons)
            {
                stack3.Children.Add(myButton);
            }
        }

        if (stackList == "stack3")
        {
            stack3.Children.Clear();

            foreach (MyButton myButton in myButtons)
            {
                stack4.Children.Add(myButton);
            }
        }
    }
}

public class MyButton : Button
{
    public MyButton(string title, EventHandler clicked)
    {
        this.Text = title;
        Clicked += clicked;
    }
}

【问题讨论】:

  • 如果它是一个 POC 项目,它可能会起作用,但只是提到您编写所有代码库逻辑的方式 - 这不是一个好方法。您可能使用了 Bindable 布局或 Listview、gridview 并将所有饮料绑定为字符串,然后在 UI 中您可以生成按钮并将所有事件绑定到命令..
  • 啊,是的,这听起来有点像重构......你能否为我指明一个教程的方向?谢谢
  • 这是一个很大的话题,但是您可以开始搜索 Xamarin Forms Mvvm Pattern。对于你现在拥有的这个项目,我最终会使用可绑定布局来实现相同的docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/…
  • 好的,感谢您的帮助

标签: c# xamarin stacklayout


【解决方案1】:

如果给stack1添加背景颜色,你会很容易发现问题。截图如下:

stack1 的高度是100,您在此处添加了 4 个四个按钮。 WineCider 按钮被添加到边界之外,因此它不会响应任何事件。

您可以提供更大的高度以使按钮起作用:

   <Grid.RowDefinitions>
        <RowDefinition Height="100"/>
        <RowDefinition Height="200"/>
        <RowDefinition Height="100"/>
    </Grid.RowDefinitions>

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 2018-07-14
    • 2017-05-10
    • 2017-08-12
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多