2015-04-23 20 views
5

Tôi đang cố gắng hiển thị/ẩn nút động bên trong biểu mẫu Xamarin ContentPage. Tôi có hai nút trong mã XAML của tôi:Thay đổi thuộc tính có thể truy cập của các biểu mẫu Xamarin Các nút 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> 

Tương ứng với 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 
     }); 
    } 
} 

Khi tôi đặt tài sản isVisible trong XAML, nó không phản ứng đối với bất kỳ sự thay đổi sở hữu trong phương pháp sự kiện (startPanic). Làm thế nào tôi có thể sửa chữa nó?

+0

Bạn đã thử xóa thiết bị.BeginInvokeOnMainThread usage? Bạn không chắc chắn lý do tại sao bạn đang sử dụng nó. –

+0

Có, tôi đã thử. – dease

Trả lời

1

Nó sẽ hoạt động tốt. Tôi sao chép mã của bạn và làm sạch nó lên một chút, nó cho thấy nút STOP, sau đó tôi

Một vài nhận xét:

  • sử dụng tài sản ngắn nếu có thể <Button Text="X"/>, nó dễ đọc
  • khi bạn thêm một trang XAML IDE thêm một tệp .xaml.cs bên cạnh nó và tạo một tệp .g.cs khác mà bạn không thấy. Tệp .g.cs chứa mã được tạo để tìm tất cả các phần tử x: Name'd và xác định trình giữ chỗ cho chúng, không cần phải tìm chúng theo tên mình
  • tất cả sự kiện do giao diện người dùng khởi tạo được thực thi trên chuỗi giao diện người dùng, không cần phải làm điều đó một cách rõ ràng

đây là XAML, giống như bạn chỉ chặt chẽ hơn và bổ sung Margin nên nút là có thể nhìn thấy

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

và mã sau:

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

Cảm ơn bạn đã trả lời. Tôi đã thử nghiệm các thay đổi của bạn, nhưng nó không giúp ích gì trong trường hợp của tôi. Những gì tôi đã nhận thấy ,. nút dừng đó hiển thị trong một khoảnh khắc ngắn (nửa giây) và sau đó biến mất. Bạn nghĩ gì về điều này? – dease

+1

Tôi khuyên bạn nên nén toàn bộ dự án của mình và chia sẻ dự án tại đây thông qua dropbox.Tôi cũng khuyên bạn nên đặt lại trình mô phỏng và chạy mã trên phần cứng để đảm bảo rằng nó không phải là một số lỗi –

+0

Khi tôi làm điều đó, tôi thông báo lỗi 'Xamarin.Forms.Xaml.XamlParseException: Không thể gán thuộc tính "isVisible" : Thuộc tính không tồn tại hoặc không thể gán hoặc loại không khớp giữa giá trị và thuộc tính'. Bạn có biết tôi đang làm gì sai không? – Richh94

9

Thay đổi mã của bạn trong tập tin xmal và viết các thuộc tính cho bắt đầu và dừng lại nút

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

Trong ViewModel viết hữu và tương tự cho nút bắt đầu sau và thiết lập IsStopVisible = true/false dựa trên của bạn logic

riêng bool _isStopVisible;

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

Sử dụng thuộc tính hiển thị của chế độ xem.

ví dụ nếu u muốn làm cho nút của bạn vô hình bạn có thể làm

if(condition) 

    { 

    button.Visibility=ViewStates.Invisible; 

    } 

    else 

    { 

    button.Visibility=ViewStates.Visible; 

    } 
+0

thêm một số giải thích – HaveNoDisplayName

0

Có lẽ tôi đến trễ nhưng tôi đã tìm kiếm này quá nhưng không thành công. Điều này có thể hữu ích cho ai đó.

objectView.SetValue(IsVisibleProperty, false); // the view is GONE, not invisible 
objectView.SetValue(IsVisibleProperty, true); 
Các vấn đề liên quan