【问题标题】:Xamarin forms Change and enable image buttonXamarin 表单更改和启用图像按钮
【发布时间】:2020-06-20 22:43:02
【问题描述】:

Sample UI design

有人知道如何更改 Imagebutton 源吗?参考图片链接,当用户点击step1(MainPage)时,它会将用户重定向到另一个页面(SecondPage)。一旦用户单击 SecondPage 中的“完成”按钮,我想更改我的 imagebutton 源,同时启用单击事件。我不确定不要从一个页面调用该函数。

(P.S 我的 btnclickcount 有时似乎不起作用...我只想记录第一次按钮单击时的开始日期时间)

    public partial class MainPage : ContentPage
    {
    public string mainpagevalue;

    int offlinecount = 0;
    int onlinecount = 0;

    public MainPage()
    {
        InitializeComponent();

    }
    private void btnOffline_Clicked(object sender, EventArgs e)
    {
        offlinecount++;
        txtOfflineStatus.Text = "IN PROGRESS";

        Navigation.PushAsync(new SecondPage(this, lblEndDT, txtOfflineStatus, btnOnline, btnMH));


        if (offlinecount == 1)
        {
            string currentDT = DateTime.Now.ToString();
            lblStartDT.Text = currentDT;
        }


    }

    private void btnOnline_Clicked(object sender, EventArgs e)
    {
        onlinecount++;

        txtOnlineStatus.Text = "IN PROGRESS";

        Navigation.PushAsync(new ThirdPage(this, lblOnlineEndDT, btnTS, txtOnlineStatus));

        if (onlinecount == 1)
        {
            string onlinestartDT = DateTime.Now.ToString();
            lblOnlineStartDT.Text = onlinestartDT;
        }

    }

第三页

 public partial class ThirdPage : ContentPage
{
    Label wopLblOnlineEndDT;
    MainPage mainpage;
    ImageButton btntroubleshoot;
    Label wolblOnlineStatus;

    public ThirdPage()
    {
        InitializeComponent();

    }
    public ThirdPage(MainPage woPage, Label lblOnlineEndDT, ImageButton btnTS, Label lblOnlineStatus)
    {
        InitializeComponent();
        mainpage = woPage;
        wopLblOnlineEndDT = lblOnlineEndDT;
        btntroubleshoot = btnTS;
        wolblOnlineStatus = lblOnlineStatus;
    }
    private void BtnDone_Clicked(object sender, EventArgs e)
    {
        string edt = DateTime.Now.ToString();
        wopLblOnlineEndDT.Text = edt;
        mainpage.mainpagevalue = wopLblOnlineEndDT.Text;
        btntroubleshoot.Source = "troubleshooting";
        btntroubleshoot.IsEnabled = true;
        wolblOnlineStatus.Text = "COMPLETED";
        wolblOnlineStatus.TextColor = Color.FromRgb(0, 214, 54);
        Navigation.PopAsync();
    }
}

XAML

 <ImageButton x:Name="btnOffline" IsEnabled="True" Source="@drawable/offlinetool.png" Grid.Row="1" Grid.Column="1" BackgroundColor="Transparent" Clicked="btnOffline_Clicked"/>
        <Label Text="Offline Tool" Grid.Row="2" Grid.Column="1" Margin="15,0,0,0"/>
        <ImageButton Source="@drawable/material.png" Grid.Row="4" Grid.Column="1" BackgroundColor="Transparent"/>
        <Label Text="Material Handler" Grid.Row="5" Grid.Column="1" />
        <Image Source="@drawable/Picture1.png" Grid.Row="6" Grid.ColumnSpan="6" BackgroundColor="Transparent"/>

        <Label Text="Start Date Time:" Grid.Row="1" Grid.Column="3"/>
        <Label Text="End Date Time:" Grid.Row="1" Grid.Column="3" Margin="7,40,0,0"/>
        <Label Text="Status:" Grid.Row="2" Grid.Column="3" Margin="58,0,0,0" />
        <Label x:Name="txtOfflineStatus" Text="NOT STARTED" TextColor="Red" Grid.Column="4" Grid.Row="2"/>
        <Label x:Name="lblStartDT" Text="" Grid.Column="4" Grid.Row="1"/>
        <Label x:Name="lblEndDT" Text="-" Grid.Column="4" Grid.Row="1" Margin="0,40,0,0"/>

        <Label Text="Start Date Time:" Grid.Row="4" Grid.Column="3"  />
        <Label Text="End Date Time:" Grid.Row="4" Grid.Column="3" Margin="7,40,0,0"/>
        <Label Text="Status:" Grid.Row="5" Grid.Column="3" Margin="58,0,0,0" />
        <Label Text="NOT STARTED" TextColor="Red" Grid.Column="4" Grid.Row="5"/>


        <!--#Online Tool-->
        <ImageButton x:Name="btnOnline" Source="@drawable/ot.png" Grid.Row="8" Grid.Column="1" BackgroundColor="Transparent" Clicked="btnOnline_Clicked" IsEnabled="False"/>
        <Label Text="Online Tool" Grid.Row="9" Grid.Column="1" Margin="19,0,0,0"/>
        <ImageButton x:Name="btnMH" Source="@drawable/mh.png" Grid.Row="11" Grid.Column="1" BackgroundColor="Transparent" Clicked="imgbtnMH_Clicked" IsEnabled="False"/>
        <Label Text="Material Handler" Grid.Row="12" Grid.Column="1"/>
        <Image Source="@drawable/Picture1.png" Grid.Row="13" Grid.ColumnSpan="6" BackgroundColor="Transparent"/>

        <Label Text="Start Date Time:" Grid.Row="8" Grid.Column="3" />
        <Label Text="End Date Time:" Grid.Row="8" Grid.Column="3" Margin="7,40,0,0"/>
        <Label Text="Status:" Grid.Row="9" Grid.Column="3" Margin="58,0,0,0" />
        <Label Text="NOT STARTED" TextColor="Red" Grid.Column="4" Grid.Row="9"/>
        <Label x:Name="lblOnlineStartDT" Text="00:00:00" Grid.Column="4" Grid.Row="8"/>
        <Label x:Name="lblOnlineEndDT" Text="" Grid.Column="4" Grid.Row="8" Margin="0,40,0,0"/>
        <Label x:Name="txtOnlineStatus" Text="NOT STARTED" TextColor="Red" Grid.Column="4" Grid.Row="9"/>

【问题讨论】:

    标签: c# xaml xamarin xamarin.forms


    【解决方案1】:

    您也可以将imageButton 的引用传递给SecondPage,并在 done 方法中更改Source。让我告诉你怎么做:

    MainPage xaml 中,创建一个名为 MyImageButtonImageButton

    <StackLayout>
        <!-- Place new controls here -->
    
        <Label x:Name="lblStartDT" Text="startTest" 
               HorizontalOptions="Center"
               VerticalOptions="CenterAndExpand"/>
    
        <Button Text="go to secondPage" Clicked="btnOffline_Clicked"  HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand"/>
    
        <Label x:Name="lblEndDT" Text="endTest" 
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand" />
    
        <ImageButton x:Name="MyImageButton" Source="Images.png" IsEnabled="False" 
                    HorizontalOptions="Center"
                    VerticalOptions="CenterAndExpand" />
    
    </StackLayout>
    

    在后面的代码中,将MyImageButton 传递给SecondPage:

        private void btnOffline_Clicked(object sender, EventArgs e)
        {
            //Pass the parametere you need when you go to SecondPage 
            //Navigation.PushAsync(new SecondPage(this, lblEndDT));
    
            Navigation.PushAsync(new SecondPage(this, lblEndDT, MyImageButton));
    
            string currentDT = DateTime.Now.ToString();
            lblStartDT.Text = currentDT;
    
        }
    

    在SecondPage中,获取myImageBtn的引用并在done方法中修改:

    public partial class SecondPage : ContentPage
    {
        Label MainPagelblEndDT;
        MainPage mainPage;
        ImageButton myImageBtn;
        public SecondPage()
        {
            InitializeComponent();
        }
    
        public SecondPage(MainPage mainP,Label lblEndDT)
        {
            InitializeComponent();
    
            //Get the lblEndDT reference here
            MainPagelblEndDT = lblEndDT;
            //Get the MainPage reference here
            mainPage = mainP;
        }
    
        public SecondPage(MainPage mainP, Label lblEndDT, ImageButton imageBtn)
        {
            InitializeComponent();
    
            //Get the lblEndDT reference here
            MainPagelblEndDT = lblEndDT;
            //Get the MainPage reference here
            mainPage = mainP;
            //Get the ImageButton reference here
            myImageBtn = imageBtn;
        }
    
        private void Button_Clicked(object sender, EventArgs e)
        {           
            string edt = DateTime.Now.ToString();
    
            //Use it
            MainPagelblEndDT.Text = edt;      
    
            mainPage.previouspagevalue = MainPagelblEndDT.Text;
    
            //change the source of imageBtn
            myImageBtn.Source = "Images1";
            myImageBtn.IsEnabled = true;
    
            Navigation.PopAsync();
        }
    }
    

    一个示例项目可用here

    【讨论】:

    • 您好,再次感谢您的帮助!真的很感激。我可以澄清一下创建公共第二页吗?当您在主页上执行 navigation.pushasync 时,它是否仅适用于该特定按钮单击事件及其在 xaml 中声明的变量?因为我尝试在我的 btnoffline 点击事件上更改另一个图像按钮源,所以它不起作用。我认为在 public secondpage 中传递变量意味着它正在调用按钮 ID?
    • @Charis 您需要做的就是获取要更改的控件的引用。向我们展示不起作用的代码,然后我们可以为您提供更好的帮助。
    • 您好,我已经更新了我的代码。我想更改 myimagebutton2 源并保留 myimagebutton 源。但是在我点击按钮后,它重叠了。
    • 我在调整了一些代码后就成功了! :) 谢谢!我的时间戳仍然有问题。我不确定是不是因为 pushasync,我的按钮点击计数会重新开始,所以我的情况不起作用
    • 点击次数的代码在哪里?顺便说一句,如果它解决了您的问题,请您标记这个答案。
    【解决方案2】:

    将按钮不透明度绑定到 0.5 之类的值并禁用按钮。

                        <ImageButton Command="{Binding EditActivityCommand}"
                                     BackgroundColor="Transparent"
                                     Opacity="{Binding Opacity}"
                                     IsEnabled="{Binding IsAdmin}">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2018-05-05
      • 2017-01-21
      相关资源
      最近更新 更多