改变Xamarin Forms XAML按钮的isVisible属性

10

我希望能够在Xamarin Forms ContentPage动态地显示/隐藏按钮。 我的XAML代码中有两个按钮:

<StackLayout Orientation="Vertical">

    <Button x:Name="start_btn" Clicked="startPanic">
        <Button.Text>START</Button.Text>
    </Button>

    <Button x:Name="stop_btn" IsVisible="false">
        <Button.Text>STOP</Button.Text>
    </Button>

</StackLayout>

相应的C#代码:

public partial class PanicPage : ContentPage
{
    private Button startBtn;
    private Button stopBtn;

    public PanicPage ()
    {
        InitializeComponent ();
        startBtn = this.FindByName<Button> ("start_btn");
        stopBtn = this.FindByName<Button> ("stop_btn");
    }

    private void startPanic(object sender, EventArgs args){
        Device.BeginInvokeOnMainThread (() => {
            startBtn.IsVisible = false;
            stopBtn.IsVisible = true; //  DOESN'T WORK, button still will be hidden
        });
    }
}

当我在XAML中设置isVisible属性时,它不会对事件方法(startPanic)中的任何属性更改做出反应。我该怎么解决?


你尝试过移除 Device.BeginInvokeOnMainThread 的使用吗?不确定你为什么要使用它。 - Paul Diston
4个回答

12

修改xmal文件中的代码,并为启动和停止按钮编写属性

<Button x:Name="start_btn" Clicked="startPanic" IsVisible="{Binding IsStartVisible}">
    <Button.Text>START</Button.Text>
</Button>

<Button x:Name="stop_btn" IsVisible="{Binding IsStopVisible}">
    <Button.Text>STOP</Button.Text>
</Button>

在ViewModel中编写以下属性,对于开始按钮也是如此,并根据您的逻辑设置IsStopVisible = true/false

   private bool _isStopVisible;

    public bool IsStopVisible{
        get {
            return _isStopVisible;
        }
        set {
            _isStopVisible= value;
            RaisePropertyChanged ("IsStopVisible");
        }
    }

3
也许我有点晚了,但我也曾经搜索过这个问题,并没有成功。这可能对某些人有用。
objectView.SetValue(IsVisibleProperty, false); // the view is GONE, not invisible
objectView.SetValue(IsVisibleProperty, true);

1
它应该能正常工作。我复制了你的代码并进行了一些清理。它显示了停止按钮,然后我想说几句:
  • 在可能的情况下使用简短属性<Button Text="X"/>,这样更容易阅读。
  • 当您添加XAML页面时,IDE会在旁边添加一个.xaml.cs文件,并生成另一个不可见的.g.cs文件。.g.cs文件包含可找到所有x:Name命名的元素并定义占位符的生成代码,无需自己按名称查找
  • 所有UI引发的事件都在UI线程上执行,无需显式执行

这是XAML,与您的相同,只是更紧凑并添加了Margin,因此按钮可见。

<StackLayout Orientation="Vertical" Margin="20">
  <Button x:Name="start_btn" Clicked="startPanic" Text="START" />
  <Button x:Name="stop_btn" Text="STOP" IsVisible="false" />
</StackLayout>

而且背后的代码是:

public partial class TestPage : ContentPage
{   
    public TestPage ()
    {
        InitializeComponent ();
    }

    private void startPanic(object sender, EventArgs args){
        Device.BeginInvokeOnMainThread (() => {
            start_btn.IsVisible = false;
            stop_btn.IsVisible = true;  
        });
    }
}

谢谢您的回答。我尝试了您的更改,但在我的情况下没有帮助。我注意到停止按钮会在短暂的(半秒钟)时刻显示,然后就消失了。您认为这是怎么回事? - dease
1
我建议您将整个项目压缩并通过 Dropbox 等方式在此共享。我还建议重置模拟器并在硬件上运行代码,以确保它不是某种偶然情况。 - Sten Petrov
当我进行操作时,我收到错误消息 Xamarin.Forms.Xaml.XamlParseException:无法分配属性“isVisible”:属性不存在,或者不能被分配,或者值与属性之间的类型不匹配。你知道我做错了什么吗? - Richh94
1
可能是因为你使用了 "isVisible" 而不是 "IsVisible"(注意第一个字母大写)? - Dids

0
使用视图的可见性属性。
例如,如果您想将按钮设置为不可见,可以执行以下操作:
if(condition)

    {

    button.Visibility=ViewStates.Invisible;

    }

    else

    {

    button.Visibility=ViewStates.Visible;

    }

add some explanation - HaveNoDisplayName

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接