【问题标题】:Updating appbar button using flyout menu使用弹出菜单更新 appbar 按钮
【发布时间】:2013-06-19 19:53:57
【问题描述】:

我有一个问题可能很简单,但我只是忽略了。

所以我创建了一个应用栏,上面有一个按钮,按下时会创建一个弹出菜单。创建按钮以便它可以容纳图像。

<button class="app-button" style="-ms-high-contrast-adjust:none" data-win-control="WinJS.UI.AppBarCommand" 
            data-win-options="{id:'appButton',icon:'url(images/logo.png)',section:'global', type: 'flyout', flyout:select('#appFlyout')}">
</button>

在弹出菜单上,我将使用项目列表填充它,但目前我只是硬编码了一个图像列表,使用 CSS 为每个按钮提供图像。

<div id="appFlyout" data-win-control="WinJS.UI.Flyout" aria-label="App Menu" style="visibility: visible;">
    <ul class="appList" list-style-type: none style="width: 127.5px;">
        <li id="app1List"><button id="app1" class="appButton"></button></li>
        <li id="app2List"><button id="app2" class="appButton"></button></li>
        <li id="app3List"><button id="app3" class="appButton"></button></li>
        <li id="app4List"><button id="app4" class="appButton"></button></li>
        <li id="app5List"><button id="app5" class="appButton"></button></li>
        <li id="app6List"><button id="app6" class="appButton"></button></li>
    </ul>
</div>

在短期内,我只需要通过我的 JavaScript 来使用弹出菜单中单击的按钮图像来更新我的应用栏上的按钮。我正在使用空白的 Windows 应用商店应用程序,因此所有内容都位于默认值中。(css/html/javascript)。

我尝试创建一个可以更新按钮的函数,然后将该函数添加到 app1 的事件侦听器中,以便单击它会更新 appbar 图像,但它不起作用。回顾结构不佳的列表(正如我所说,这只是暂时的权宜之计),有没有更好的方法来做这些,或者我需要按照我的想法去做,并为弹出窗口中的每个按钮添加一个事件侦听器菜单?

【问题讨论】:

  • 你能让应用栏按钮更新到任何新图标吗?如果在 CSS 中设置li,我不确定您是否能够确定它的图标。所以我首先建议让您的点击处理程序将AppBarButton 图标更新为一些硬编码值。

标签: html css windows-8 windows-store-apps winjs


【解决方案1】:

考虑使用WinJS.UI.ListView 控件作为浮出控件中的列表。如果您之前没有使用过列表视图,请参考quickstart sample

它可以绑定到一个列表,每个项目代表一个按钮 img。使用iteminvoked 事件处理程序为appbar 中的appbarcommand 设置选中的按钮图像。

以下不是完整的代码。但部分代码,给出一个想法。

var buttonFilePaths = [ 
{ iconFilePath: '/images/button1.png' }, 
{ iconFilePath: '/images/button2.png'}, 
{ iconFilePath: '/images/button3.png'}];
var list = new WinJS.Binding.List(buttonFilePaths);
// bind this list data source to the listview control.
listview.winControl.itemDataSource = list.dataSource;

// register for iteminvoked event when the item is tapped;
listView.addEventListern('iteminvoked', function (event)
{
    var selectedIndex = event.detail.itemIndex;
    var item = list.getAt(selectedIndex);
    appButton.winControl.icon = item.iconFilePath; 
});

html:

<div id='listview' data-win-control="WinJS.UI.ListView'
  data-win-options="{ tapBehavior: 'invokeOnly', selectionMode: 'none', swipeBehavior: 'none'
     , itemTemplate: select('#itemTemplate')}" >
</div>
<div id='itemTemplate' data-win-control='WinJS.Binding.Template'>
    <div class='list-item'>
        <img data-win-bind='src: iconFilePath' />
    </div>
</div>

【讨论】:

  • 我收到一个错误,它说 listView(在 javascript 中)未定义。我试图通过 id 获取 listview 元素,但它说它不能在未定义或 null 变量(我设置为元素 ID 的 listView 变量)上调用 winControl。添加事件侦听器时我缺少什么?
  • 没关系,忽略以上。我当时很傻。我再试一次。
  • WinJS.UI.ListView 看起来是不是有点矫枉过正?
  • @JeremyFoster 如果列表包含很少的项目(比如 1-3) - 是的。否则,这看起来比为每个 li 注册多个事件处理程序更干净。
  • 我认为 WinJS.UI.ListView 会派上用场。目前,在几乎 POC 的早期阶段,这可能是矫枉过正。但我认为它会更有用。
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多