0

我想从 C# 的代码隐藏中以编程方式添加 BottomAppBar。我是这样完成的:

1:添加了一个具有 DataTemplate 的资源文件,其中包含一个 Grid、一个 StackPanel 和两个按钮。

2:在我的 BasePage.cs(派生自 Page 类)中,我定义了一个新的 AppBar 并将其 ContentTemplate 设置为在步骤 1 中创建的资源。

3:我从第 2 步设置了 this.BottomAppBar= AppBar。

现在,这会将 AppBar 添加到我从 BasePage 派生的所有页面中。这工作正常。

问题:

我无法从 AppBar 中的两个元素中获取 PointerPressed 或任何其他事件。

我确信这是我所缺少的非常基本的东西。任何想法,任何人?

更新:下面添加了示例下载链接,我想要的是当单击 BottomAppBar(Page1 和 2)中的图像时,它应该带我到 MainPage。

下载样本

应用条码

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