web-dev-qa-db-ja.com

Xamarin FormsXAMLボタンのisVisibleプロパティの変更

Xamarin FormsContentPage内のボタンを動的に表示/非表示にしようとしています。 XAMLコードに2つのボタンがあります。

<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)でのプロパティの変更に反応しません。どうすれば修正できますか?

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

それはうまくいくはずです。コードをコピーして少しクリーンアップしました。STOPボタンが表示されたら、

いくつかの注意:

  • 可能な場合はshortプロパティを使用します<Button Text="X"/>、読みやすい
  • xAMLページを追加すると、IDEはその横に.xaml.csファイルを追加し、表示されない別の.g.csを生成します。g.csファイルには生成されたコードが含まれますすべてのx:Name'd要素を検索し、それらのプレースホルダーを定義します。自分で名前で検索する必要はありません。
  • uIによって開始されるすべてのイベントはUIスレッドで実行され、明示的に実行する必要はありません。

これがXAMLです。これは、ボタンが表示されるようにマージンを追加して追加したものと同じです。

<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

ビューのVisibilityプロパティを使用します。

たとえば、ボタンを非表示にしたい場合は、次のことができます。

if(condition)

    {

    button.Visibility=ViewStates.Invisible;

    }

    else

    {

    button.Visibility=ViewStates.Visible;

    }
0
vebs