2012-08-14 15 views
11

Mục tiêu của tôi là chỉ có một AppBar có sẵn trong một tình huống nhất định. Tôi đang cố gắng thực hiện điều này bằng cách tạo một AppBar, nhưng để nó bị vô hiệu hóa cho đến khi hoàn cảnh đó phát sinh. Tuy nhiên, nếu bạn đặt thuộc tính IsEnabled trên AppBar thành False, khi bạn khởi chạy ứng dụng và nhấp chuột phải (thường mở AppBar), ứng dụng sẽ gặp sự cố. Đây có phải là một lỗi trong khuôn khổ? Cách thích hợp để vô hiệu hóa một AppBar là gì?Làm thế nào để vô hiệu hóa Windows 8/WinRT AppBar?

CHỈNH SỬA: Nó cũng xảy ra khi bạn đặt Visibility thành Collapsed.

Thông tin thêm: Tôi đang chạy nó thông qua trình gỡ lỗi Visual Studio, nhưng một cửa sổ "Visual Studio Just-In-Time Debugger" riêng biệt xuất hiện với thông báo "Ngoại lệ win32 chưa được giải quyết xảy ra trong App.exe [2596] . " Một hộp cảnh báo bật lên trên đầu trang mà nói rằng "Một trình gỡ rối được gắn vào App.exe nhưng không được cấu hình để gỡ lỗi ngoại lệ chưa được giải quyết này. Để gỡ lỗi ngoại lệ này, hãy tháo trình gỡ lỗi hiện tại."

CHỈNH SỬA 2: Đó không chỉ là mã của tôi. Nó cũng bị treo nếu bạn chỉ cần thêm IsEnabled="False" vào AppBar trong dự án AppBarControl mẫu của Microsoft (được tìm thấy tại đây: http://code.msdn.microsoft.com/windowsapps/XAML-AppBar-control-sample-2aa1cbb4)

EDIT 3: @G. Andrew Duthie - devhammer cung cấp câu trả lời tôi đang sử dụng. Tôi chỉ muốn thêm rằng tôi thấy rằng tốt nhất là sử dụng this.BottomAppBar = null để vô hiệu hóa nó như trái ngược với thiết lập thuộc tính IsEnabled hoặc Visibility. Nếu bạn chỉ cần đặt Visibility thành Collapsed, thì khi bạn nhấp chuột phải, ứng dụng vẫn cho rằng một AppBar có mặt mặc dù nó không hiển thị, vì vậy nhấp chuột thông thường tiếp theo của bạn sẽ được hiểu là nhấp chuột thường loại bỏ AppBar. sẽ phải nhấp vào lần thứ hai để thực sự thực hiện hành động mà bạn đang cố gắng thực hiện.

+3

"Sự cố ứng dụng" có nghĩa là gì? Nó có gặp sự cố trong khung công tác không? Trong mã của bạn? Bạn có một callstack? Là một ngoại lệ ném? Ngoại lệ (và thông điệp) là gì? –

+0

Tôi nghĩ rằng nó đang gặp sự cố trong khung công tác. Tôi đang chạy nó thông qua trình gỡ lỗi Visual Studio, nhưng một cửa sổ "Visual Studio Just-In-Time Debugger" riêng biệt xuất hiện với thông báo "Một ngoại lệ win32 chưa được giải quyết xảy ra trong App.exe [2596]." Một hộp cảnh báo bật lên trên đầu trang mà nói rằng "Một trình gỡ rối được gắn vào App.exe nhưng không được cấu hình để gỡ lỗi ngoại lệ chưa được giải quyết này. Để gỡ lỗi ngoại lệ này, hãy tháo trình gỡ lỗi hiện tại." – jokeefe

+0

Tôi nghĩ chúng ta cần thêm ngữ cảnh để phát hiện vấn đề. Bạn có thể đăng xBl AppBar của bạn không? – mydogisbox

Trả lời

8

Tôi đã chơi với điều này một chút (sử dụng cả IsEnabled, cũng như thiết lập thuộc tính Visibility thành Visibility.Collapsed), và cách duy nhất tôi có thể vô hiệu hóa thành công AppBar mà không tăng ngoại lệ là để hiển thị AppBar đầu tiên. Khi AppBar đã được hiển thị, thiết lập IsEnabled thành false, hoặc thiết lập Visibility thành Visibility.Collapsed không còn ném ngoại lệ nữa.

Tuy nhiên, nếu bạn tạo AppBar lập trình, như vậy:

myAppBar = new AppBar(); 
StackPanel sp = new StackPanel(); 
sp.Orientation = Orientation.Horizontal; 
Button myButton = new Button(); 
myButton.Content = "Click Me"; 
sp.Children.Add(myButton); 
myAppBar.Content = sp; 

nhưng không thêm nó vào Page.BottomAppBar cho đến khi lần đầu tiên bạn cần đến nó, bạn sẽ không nhận được ngoại lệ.

Tôi đã thử nghiệm bằng cách sử dụng nút có xử lý như sau:

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    if (this.BottomAppBar == null) 
    { 
     this.BottomAppBar = myAppBar; 
    } 
    else { 
     this.BottomAppBar = null; 
    } 
} 

Khi ứng dụng tải lần đầu tiên, nếu bạn cố gắng gọi AppBar, không có gì xảy ra. Nhấn nút (thêm AppBar vào Page.BottomAppBar), và gọi AppBar sẽ hiển thị AppBar. Nhấp vào nút một lần nữa, và AppBar không còn được hiển thị (mặc dù myAppBar vẫn được khởi tạo và sẵn sàng khi bạn cần lại).

Hy vọng điều đó sẽ hữu ích!

+1

Công việc này hoàn hảo. Cảm ơn bạn! Tôi thấy rằng tốt nhất là sử dụng 'this.BottomAppBar = null' để vô hiệu hóa nó như trái ngược với thiết lập các thuộc tính' IsEnabled' hoặc 'Visibility'. Nếu bạn chỉ đặt 'Hiển thị' thành' Đã thu gọn', khi bạn nhấp chuột phải, ứng dụng vẫn cho rằng một AppBar có mặt mặc dù nó không hiển thị, vì vậy nhấp chuột thông thường tiếp theo của bạn sẽ được hiểu là nhấp chuột thường loại bỏ AppBar, vì vậy bạn sẽ phải nhấp vào lần thứ hai để thực sự thực hiện hành động mà bạn đang cố gắng thực hiện. Cảm ơn một lần nữa vì sự giúp đỡ! – jokeefe

+0

Niềm vui của tôi. Mừng vì tôi có thể giúp. – devhammer

+0

Cố gắng tải đối tượng tài nguyên trên thanh ứng dụng được xác định trong tệp xaml không thành công. Tuy nhiên, tôi đã thành công với việc chỉ sử dụng mã thô mà không có bất kỳ tài nguyên xaml nào. –

2

Bạn có thể sử dụng CustomAppBar từ WinRT XAML Toolkit. Nó có thể được vô hiệu hóa theo nhiều cách - bạn có thể ràng buộc các thuộc tính CanOpen hoặc CanDismiss của nó để ngăn chặn nó xuất hiện hoặc biến mất, có thể là những gì bạn muốn.

+1

Tất nhiên rồi. Anh ta/cô ấy muốn appbar hoạt động hoặc không hoạt động tùy thuộc vào điều kiện và CustomAppBar chỉ cung cấp nó và nó không sụp đổ. Tôi tạo ra nó chính xác do những hạn chế của/vấn đề với AppBar bản địa. –

+0

Cảm ơn rất nhiều vì gợi ý của bạn, @Filip Skakun. Nếu tôi không thể có được giải pháp G. Andrew Duthie - devhammer được cung cấp để làm việc, tôi chắc chắn sẽ đi con đường này. Tôi sẽ kiểm tra lại với thư viện của bạn lần sau khi tôi gặp một vấn đề như thế này. – jokeefe

4

Nếu bạn vẫn muốn xác định AppBar của mình trong XAML, bạn có thể đóng AppBar theo cách lập trình trong mã phía sau.Trong XAML, tạo AppBar đáy:

<Page.BottomAppBar> 
    <AppBar Name="MyAppBar" Opened="AppBarOpened"> 
     ... 
    </AppBar> 
</Page.BottomAppBar> 

Sau đó, trong đoạn code C# sau:

private void AppBarOpened(object sender, object e) 
{ 
    if (CanAppBarOpen() == false) 
    { 
     MyAppBar.IsOpen = false; 
    } 
} 

Bạn sẽ phải thực hiện kiểm tra của riêng bạn cho "CanAppBarOpen()"

+0

Hoạt động hoàn hảo, nhờ – Lufi

2

Bạn có thể làm như thế này bằng cách xử lý mở trường hợp AppBar

trong XAML:

<Page.BottomAppbar> 
    <AppBar IsEnabled="False" Visibility="Collapsed" Opened="bottomappbar_opened_event"> 
</Page.BottomAppbar> 

Trong C# Code:

private void bottomappbar_opened_event(object sender, object e) 
{ 
    if (!this.BottomAppBar.IsEnabled) 
    { 
     if (this.BottomAppBar.IsOpen) 
     this.BottomAppBar.IsOpen = false; 
    } 
} 
0

1. Thêm một thay đổi sự kiện lựa chọn để kiểm soát flipview của bạn trong file XAML:

<FlipView SelectionChanged="MyFlipView_SelectionChanged" /> 

2. Thêm thành viên lớp này biến thành tệp xaml code-behind của bạn:

Dictionary<object, Tuple<AppBar, AppBar>> _appbarDictionary = new Dictionary<object, Tuple<AppBar, AppBar>>(); 

3. Thực hiện lựa chọn của FlipView thay đổi xử lý ở đây:

private void MyFlipView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var flipView = sender as FlipView; 

    BuildPageAppBarDictionary(); 

    InitializeAppBar(flipView); 
    NullOtherAppBars(flipView); 
} 
  1. Thêm các phương pháp:

    private void BuildPageAppBarDictionary() { _appbarDictionary.Clear();

    foreach (var item in MyFlipView.Items) 
    { 
        var page = item as Page; 
        Tuple<AppBar, AppBar> appbars = new Tuple<AppBar, AppBar>(page.TopAppBar, page.BottomAppBar); 
        _appbarDictionary.Add(page, appbars); 
    } 
    

    }

    private void InitializeAppBar (FlipView flipView) { if (_appbarDictionary.Count> 0) { var currentPage = flipView.SelectedItem như trang; currentPage.TopAppBar = _appbarDictionary [currentPage] .Item1; currentPage.BottomAppBar = _appbarDictionary [currentPage] .Item2;

    if (currentPage.TopAppBar != null) 
        { 
         currentPage.TopAppBar.IsEnabled = true; 
        } 
    
        if (currentPage.BottomAppBar != null) 
        { 
         currentPage.BottomAppBar.IsEnabled = true; 
        } 
    } 
    

    }

    tin NullOtherAppBars void (FlipView flipView) { foreach (var item trong MyFlipView.Items) { if (item! = FlipView.SelectedItem) { trang var = mục dưới dạng Trang;

      page.TopAppBar = null; 
          page.BottomAppBar = null; 
         } 
        } 
    } 
    

Hãy tha thứ cho những vấn đề đoạn định dạng. Tôi đã cố gắng tạo định dạng mẫu cho trang này tốt nhất có thể.

+0

danh sách trộn và mã không hoạt động tốt (có cùng vấn đề khi bắt đầu đăng bài ở đây :-) – kleopatra

Các vấn đề liên quan