wake-up-neo.com

Ändern der isVisible-Eigenschaft von Xamarin Forms-XAML-Schaltflächen

Ich versuche, die Schaltfläche in Xamarin Forms ContentPage dynamisch anzuzeigen/auszublenden. Ich habe zwei Schaltflächen in meinem XAML-Code:

<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>

Entsprechender C # -Code:

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
        });
    }
}

Wenn ich die Eigenschaft isVisible in XAML setze, reagiert sie nicht auf Änderungen der Eigenschaft in der Ereignismethode (startPanic). Wie kann ich es reparieren?

6
dease

Ändern Sie Ihren Code in der XMAL-Datei und schreiben Sie die Eigenschaften für die Start- und Stoppschaltfläche

<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>

In ViewModel schreiben Sie die folgende Eigenschaft und ähnliches für die Startschaltfläche und setzen IsStopVisible = true/false basierend auf Ihrer Logik

private bool _isStopVisible;

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

Es sollte gut funktionieren. Ich habe Ihren Code kopiert und ein bisschen aufgeräumt, er zeigt die STOP-Taste, dann habe ich

Ein paar Bemerkungen:

  • benutze die kurze Eigenschaft <Button Text="X"/>, es ist einfacher zu lesen
  • wenn Sie eine XAML-Seite hinzufügen, fügt die IDE eine .xaml.cs-Datei daneben hinzu und generiert eine weitere .g.cs-Datei, die Sie nicht sehen. Die .g.cs-Datei enthält generierten Code, der alle x: Name'd-Elemente findet und Platzhalter für sie definiert, ohne dass Sie sie selbst anhand des Namens suchen müssen
  • alle von der Benutzeroberfläche ausgelösten Ereignisse werden auf dem Benutzeroberflächenthread ausgeführt. Dies ist nicht explizit erforderlich

Hier ist die XAML, genau wie deine, nur enger und mit Rand versehen, damit die Schaltfläche sichtbar ist

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

Und der Code dahinter:

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

Vielleicht bin ich spät dran, aber ich habe das auch ohne Erfolg gesucht. Dies kann für jemanden nützlich sein.

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

Verwenden Sie die Sichtbarkeitseigenschaft der Ansicht.

zum Beispiel, wenn Sie Ihre Schaltfläche unsichtbar machen möchten, können Sie dies tun

if(condition)

    {

    button.Visibility=ViewStates.Invisible;

    }

    else

    {

    button.Visibility=ViewStates.Visible;

    }
0
vebs