11

私の目標は、特定の状況下でのみAppBarを使用できるようにすることです。AppBarを作成してこれを実現しようとしていますが、その状況が発生するまで無効のままにしておきます。ただし、IsEnabledAppBarの属性をに設定するFalseと、アプリを起動して右クリック(通常はAppBarが開きます)すると、アプリケーションがクラッシュします。これはフレームワークのバグですか?AppBarを無効にする適切な方法は何ですか?

Visibility編集:に設定した場合にも発生しますCollapsed

詳細:Visual Studioデバッガーで実行していますが、別の[Visual StudioJust-In-TimeDebugger]ウィンドウに「未処理のwin32例外がApp.exe[2596]で発生しました」というメッセージが表示されます。その上に、「デバッガーはApp.exeに接続されていますが、この未処理の例外をデバッグするように構成されていません。この例外をデバッグするには、現在のデバッガーをデタッチしてください」という警告ボックスがポップアップ表示されます。

編集2:それは私のコードだけではありません。IsEnabled="False"また、Microsoft独自のサンプルAppBarControlプロジェクト(ここにあります:http://code.msdn.microsoft.com/windowsapps/XAML-AppBar-control-sample-2aa1cbb4)のAppBarに追加するだけでもクラッシュします。

編集3:@G。AndrewDuthie-devhammerが私が使用している答えを提供してくれました。またはプロパティthis.BottomAppBar = nullを設定するのではなく、無効にするために使用するのが最善であることがわかったことを追加したかっただけです。に設定した場合、右クリックすると、アプリはAppBarが表示されていなくても存在すると見なします。そのため、次の通常のクリックは、通常AppBarを閉じるクリックとして解釈されるため、次のようになります。試みていたアクションを実際に実行するには、もう一度クリックする必要があります。IsEnabledVisibilityVisibilityCollapsed

4

5 に答える 5

8

私はこれを少し遊んでいます(IsEnabledとVisibilityプロパティをVisibility.Collapsedの両方を使用して)、例外を発生させずにAppBarを正常に無効にできる唯一の方法は、最初にAppBarを表示することでした。AppBarが表示されたら、IsEnabledをfalseに設定するか、VisibilityをVisibility.Collapsedに設定しても、例外がスローされなくなりました。

ただし、次のようにプログラムでAppBarを作成する場合は次のようになります。

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;

ただし、最初に必要になるまで、Page.BottomAppBarに追加しないでください。例外は発生しません。

次のハンドラーでボタンを使用してテストしました。

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

アプリが最初に読み込まれるときに、AppBarを呼び出そうとしても、何も起こりません。ボタン(AppBarをPage.BottomAppBarに追加します)をクリックすると、AppBarを呼び出すとAppBarが表示されます。ボタンをもう一度クリックすると、AppBarは表示されなくなります(ただし、myAppBarは引き続きインスタンス化され、必要なときに準備ができています)。

お役に立てば幸いです。

于 2012-08-14T19:30:35.797 に答える
4

それでもXAMLでAppBarを定義したい場合は、コードビハインドでAppBarをプログラムで閉じることができます。XAMLで、下部のAppBarを作成します。

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

次に、背後にあるC#コードで:

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

「CanAppBarOpen()」の独自のチェックを実装する必要があります

于 2012-09-05T19:43:36.060 に答える
2

WinRTXAMLToolkitからCustomAppBarを使用できます。複数の方法で無効にすることができます。CanOpenまたはCanDismissプロパティをバインドして、表示または非表示をブロックできます。これは、必要な場合があります。

于 2012-08-14T19:01:07.713 に答える
2

AppBarの開かれたイベントを処理することにより、このようにすることができます

XAMLの場合:

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

C#コードの場合:

 private void bottomappbar_opened_event(object sender, object e)
 {
     if (!this.BottomAppBar.IsEnabled)
     {
         if (this.BottomAppBar.IsOpen)
         this.BottomAppBar.IsOpen = false;
     }
 }
于 2012-09-26T11:28:04.780 に答える
0

1.xamlファイルのflipviewコントロールに選択変更イベントを追加します。

<FlipView SelectionChanged="MyFlipView_SelectionChanged" />

2.このクラスメンバー変数をxaml分離コードファイルに追加します。

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

3.FlipViewの選択変更ハンドラーをここに実装します。

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

    BuildPageAppBarDictionary();

    InitializeAppBar(flipView);
    NullOtherAppBars(flipView);
}
  1. 次のメソッドを追加します。

    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 briefView){if(_appbarDictionary.Count> 0){var currentPage = briefView.SelectedItem as Page; 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;
        }
    }
    

    }

    private void NullOtherAppBars(FlipView briefView){foreach(var item in MyFlipView.Items){if(item!= briefView.SelectedItem){var page = item as Page;

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

スニペットのフォーマットの問題はご容赦ください。このページのサンプルフォーマットをできる限り作成しようとしました。

于 2013-02-11T04:14:22.893 に答える