【问题标题】:Call a stack layout from another page从另一个页面调用堆栈布局
【发布时间】:2020-03-06 15:07:29
【问题描述】:

我正在使用 c# 创建一个 Xamarin.Forms 应用。

Page 中有一个 Button,我想在 StackLayout 中添加一个新的 Label,即在Main Page 中单击按钮

我尝试在 XAML 文件中设置StackLayout publicFieldModifier 属性,但没有成功...

这是布局代码(我想将标签添加到MainStackLayout)和按钮点击的cs方法:

 <ContentPage.Content>
    <ScrollView>
        <StackLayout BackgroundColor="white">
            <StackLayout Orientation="Horizontal" x:Name="MainStackLayout" x:FieldModifier="public" >
            </StackLayout>
            <Button 
                Text="Add Counter"
                BackgroundColor="darkgreen"
                HorizontalOptions="FillAndExpand"
                CornerRadius="0"
                HeightRequest="80"
                TextColor="white"
                FontAttributes="Bold"
                x:Name="AddCounter_btn"
               Clicked="AddCounter_btn_Clicked"
               >

            </Button>
        </StackLayout>
    </ScrollView>
</ContentPage.Content>

private void StartCount_btn_Clicked(object sender,EventArgs e)
{
    Label NCounterName =new Label();
    NCounterName.Text = counter_txt.Text.ToString();
    Label NCounterNumber = new Label();
    NCounterNumber.Text = "0000";`enter code here`
}

【问题讨论】:

  • 当您单击按钮时,您希望 NCounterName 和 NCounterNumber 都添加到 MainStackLayout 中吗?
  • 而且,您的意思是 AddCounter_btn_Clicked 而不是 StartCount_btn_Clicked?
  • 直接从另一个页面修改一个视图通常是一个非常糟糕的想法。使用 MessagingCenter 来执行此操作会更好。
  • 您的问题解决了吗?

标签: c# xamarin xamarin.forms


【解决方案1】:

假设您在Page1 中有一个按钮,即StartCount_btn,当您单击此按钮时,您希望在 Page2 中为MainStackLayout 添加一些标签。

Page1中,点击StartCount_btn按钮时发送addLabelNotification

private void StartCount_btn_Clicked(object sender, EventArgs e)
{
    MessagingCenter.Send<Object>(this, "addLabelNotification");
}

Page2中,订阅消息并在收到消息时添加标签:

public partial class Page2 : ContentPage
{
    public Page2()
    {
        InitializeComponent();

        MessagingCenter.Subscribe<Object>(this, "addLabelNotification", (sender) =>
        {
            // Do something whenever the "addLabelNotification" message is received

            Label NCounterName = new Label();
            NCounterName.Text = "counter_txt";
            Label NCounterNumber = new Label();
            NCounterNumber.Text = "0000";

            MainStackLayout.Children.Add(NCounterName);
            MainStackLayout.Children.Add(NCounterNumber);

        });
    }
}

参考:messaging-center

【讨论】:

    【解决方案2】:

    我在这里写了这段代码,无法检查,但它会工作。您的按钮为您提供了足够的信息来访问任何视图。您只需使用父子控件。

    private void StartCount_btn_Clicked(object sender,EventArgs e)
    {
        if(sender is Button myButton)
        {
            if(myButton.Parent is StackLayout myStackLayout)
            {
                Label NCounterName =new Label();
                //set your label's text
                myStackLayout.Add.Children(NCounterName);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2012-01-30
      • 2013-04-16
      相关资源
      最近更新 更多