it-swarm.com.ru

Изменение свойства isVisible кнопок XAML Xamarin Forms

Я пытаюсь динамически отобразить/скрыть кнопку внутри 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
        });
    }
}

Когда я устанавливаю свойство isVisible в XAML, оно не реагирует ни на какое изменение свойства в методе события (startPanic). Как я могу это исправить?

6
dease

Измените свой код в файле 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");
        }
    }
9
Dnyanesh

Это должно работать просто отлично. Я скопировал ваш код и немного его почистил, он показывает кнопку СТОП, затем я

Несколько замечаний:

  • по возможности используйте свойство short <Button Text="X"/>, его легче читать .__
  • когда вы добавляете страницу XAML, IDE добавляет файл .xaml.cs рядом с ним и генерирует другой файл .g.cs, который вы не видите. Файл .g.cs Содержит сгенерированный код, который находит все элементы x: Name'd и Определяет их заполнители, нет необходимости искать их по имени
  • все инициированные пользовательским интерфейсом события выполняются в потоке пользовательского интерфейса, нет необходимости делать это явно

Вот 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;  
        });
    }
}
1
Sten Petrov

Может быть, я опоздал, но я искал это тоже безуспешно. Это может быть полезно для кого-то. 

objectView.SetValue(IsVisibleProperty, false); // the view is GONE, not invisible
objectView.SetValue(IsVisibleProperty, true);
1
atapi19

Используйте свойство видимости зрения.

например, если вы хотите сделать вашу кнопку невидимой, вы можете сделать

if(condition)

    {

    button.Visibility=ViewStates.Invisible;

    }

    else

    {

    button.Visibility=ViewStates.Visible;

    }
0
vebs