0

C#のコードビハインドからプログラムでBottomAppBarを追加したいと思います。私はそれをこのようにやりました:

1:グリッド、StackPanel、および2つのボタンを含むDataTemplateを含むリソースファイルを追加しました。

2:BasePage.cs(Pageクラスから派生)で、新しいAppBarを定義し、そのContentTemplateをステップ1で作成したリソースに設定します。

3:ステップ2からthis.BottomAppBar=AppBarを設定しました。

これで、BasePageから派生したすべてのページにAppBarが追加されます。これは正常に機能します。

問題:

AppBarの2つの要素からPointerPressedまたはその他のイベントを発生させることができません。

それは私が見逃している非常に基本的なものだと確信しています。何かアイデアはありますか?

更新:以下に追加されたサンプルのダウンロードリンク。BottomAppBar(ページ1および2)の画像をクリックすると、MainPageに移動します。

サンプルをダウンロード

AppBarコード

AppBar appbar = new AppBar();
appbar.Name = "BottomBar";
DataTemplate dt = Application.Current.Resources["BottomAppBarDT"] as DataTemplate;
appbar.ContentTemplate = dt;
this.BottomAppBar = appbar;
4

3 に答える 3

2

データ テンプレートでは、イベント ハンドラーの代わりにコマンドを実装するのが常に最善です。やりたいことは、トリガーしようとしているボタンクリックイベントと同じ方法論を持つ DelegateCommand を作成することです。DelegateCommand のコードは、この特定のコントロール (アプリ バー) の親の DataContext として機能するビュー モデルに配置する必要があります。コマンド アグリゲーターを持つ MVVM 構造を使用している場合は、そこに配置する必要があります。

public class DelegateCommand : ICommand
  {
    private Action _action;

    public DelegateCommand(Action action)
    {
      _action = action;
    }

    public bool CanExecute(object parameter)
    {
      return true;
    }

    public event Windows.UI.Xaml.EventHandler CanExecuteChanged;


    public void Execute(object parameter)
    {
      _action();
    }
  }

  /// <summary>
  /// Gets a command that executes a search
  /// </summary>
  public ICommand ExecuteSearchCommand
  {
    get
    {
      return new DelegateCommand(() => ExecuteSearch());
    }
  }
于 2012-12-05T14:48:29.127 に答える
0

実際Clickに のボタンにイベント ハンドラを追加しましたAppBarか?

于 2012-12-04T19:12:46.530 に答える
0

これが最終的なコードです。

BaseView.cs

public partial class BaseView: Page
    {
        public BaseView()
        {
            GoHomeCommand = new MyCommand<object>(OnGoHome);
            this.DataContext = this;
        }
        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            AddAppBar();
        }
        private void AddAppBar()
        {
            AppBar appbar = new AppBar();
            appbar.Name = "BottomBar";
            DataTemplate dt = Application.Current.Resources["BottomAppBarDT"] as DataTemplate;
            appbar.ContentTemplate = dt;
            this.BottomAppBar = appbar;
        }

        public MyCommand<object> GoHomeCommand { get; set; }
        void OnGoHome(object obj)
        {
            Debug.WriteLine("Go Home2");
            Frame.Navigate(typeof(MainPage));
        }
    }

    public class DelegateCommand : ICommand
    {
        private Action _action;

        public DelegateCommand(Action action)
        {
            _action = action;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            _action();
        }
    }

リソース

<DataTemplate x:Key="BottomAppBarDT" >
        <Grid x:Name="AppBarGrid" Background="SlateGray">
            <StackPanel x:Name="AppBarRightStack" Orientation="Horizontal" HorizontalAlignment="Left">
                <Button Command="{Binding GoHomeCommand}" FontSize="24">
                    <Image Source="Assets/Logo.png" Height="100" Width="100"/>
                </Button>
            </StackPanel>
        </Grid>
    </DataTemplate>
于 2012-12-09T02:17:22.037 に答える