在ListLayout中显示具有可变高度的项目

时间:2012-06-29 14:38:21

标签: listview microsoft-metro winjs

我有一个WinJs metro应用程序,其中包含ListView项,其中包含可变高度的项目。它基本上与"HTML ListView item templates" sample中的场景4中的方式相同。 groupInfo函数用于启用与ListView关联的GridLayout的单元格显示:

items in grid layout

现在,在我的应用程序的快照视图中,我希望项目可以垂直滚动,因此我尝试将GridLayout替换为ListLayout。这会导致垂直滚动,但现在缺少单元格并且项目重叠:

items in list layout

我使用groupInfo函数的方式与GridLayout相同,但似乎被忽略了:

layout: { 
    groupInfo: groupInfo, 
    type: WinJS.UI.ListLayout 
} 

有没有办法在ListLayout中使用可变大小的项目?我的一些项目比其他项目更多内容,我真的想使用不同大小的瓷砖以最佳方式显示所有内容。

2 个答案:

答案 0 :(得分:0)

  

旧帖子

     

是的,你当然可以自定义一切。我想你的渲染   问题来自于你可能忘记了forceLayout

ready: function (element, options) { 
            element.querySelector("#listView").winControl.forceLayout(); 
        }
     

我没有接近我的Windows 8所以如果没有其他人回复和   问题不是来自forceLayout我会更新响应   那个晚上。

     

我希望这有帮助。

好的,我早些时候误解了你的问题。

这是应该让你满意的事情。

问题是你必须在JavaScript和CSS文件中管理应用程序的不同视图状态。

关于JavaScript,我使用了两个可以在Grid Application模板中找到的函数。所以我修改了scenario4.js来获取这段代码。

function MyCellSpanningJSTemplate(itemPromise) {
    return itemPromise.then(function (currentItem) {
        var result = document.createElement("div");

        // Use source data to decide what size to make the
        // ListView item
        result.className = currentItem.data.type;
        result.style.overflow = "hidden";

        // Display image
        var image = document.createElement("img");
        image.className = "regularListIconTextItem-Image";
        image.src = currentItem.data.picture;
        result.appendChild(image);

        var body = document.createElement("div");
        body.className = "regularListIconTextItem-Detail";
        body.style.overflow = "hidden";
        result.appendChild(body);

        // Display title
        var title = document.createElement("h4");
        title.innerText = currentItem.data.title;
        body.appendChild(title);

        // Display text
        var fulltext = document.createElement("h6");
        fulltext.innerText = currentItem.data.text;
        body.appendChild(fulltext);

        return result;
    });
}

var appViewState = Windows.UI.ViewManagement.ApplicationViewState;
var appView = Windows.UI.ViewManagement.ApplicationView;
var ui = WinJS.UI;

(function () {
    "use strict";
    var page = WinJS.UI.Pages.define("/html/scenario4.html", {
        initializeLayout: function (listView, viewState) {
            /// <param name="listView" value="WinJS.UI.ListView.prototype" />

            if (viewState === appViewState.snapped) {
                listView.layout = new ui.ListLayout();
            } 
            else {
                listView.layout = new ui.GridLayout({ groupInfo: groupInfo });
            }
        },
        ready: function (element, options) {
            var listView = element.querySelector("#listView").winControl;
            this.initializeLayout(listView, appView.value);
        },
        updateLayout: function (element, viewState, lastViewState) {

            var listView = element.querySelector("#listView").winControl;

            if (lastViewState !== viewState) {
                if (lastViewState === appViewState.snapped || viewState === appViewState.snapped) {                   
                    this.initializeLayout(listView, viewState);
                } 
                else {
                    listView.layout = new ui.GridLayout({ groupInfo: groupInfo });
                }
            }
        }
    });
})();

然后我删除了scenario4.html中listview的整个layout属性,因为我在scenario4.js中创建了上面的布局

因此,您的列表视图使用不同的布局,具体取决于视图状态,但您将获得与之前相同的结果(顺便说一下,当您处于捕捉模式以查看结果时,您必须更改方案)。

所以我们必须根据视图状态更新scenario4.css,在CSS 3中我们有媒体查询,允许我们这样做。 然后,根据视图状态snapped,我们将覆盖我们的属性。您只需将以下代码添加到scenario4.css

即可
@media screen and (-ms-view-state: snapped) {
    #listView {
        max-width: 260px;
        height: 280px;
        border: solid 2px rgba(0, 0, 0, 0.13);
    }

    .regularListIconTextItem {
        max-width: 250px;
        max-height: 70px;
        padding: 5px;
        overflow: hidden;
        display: -ms-grid;
    }

    .smallListIconTextItem {
        max-width: 250px;
        max-height: 70px;
        padding: 5px;
        overflow: hidden;
        background-color: Pink;
        display: -ms-grid;
    }

    /* Medium size */
    .mediumListIconTextItem {
        max-width: 250px;
        max-height: 70px;
        padding: 5px;
        overflow: hidden;
        background-color: LightGreen;
        display: -ms-grid;
    }

    /* Large size */
    .largeListIconTextItem {
        max-width: 250px;
        max-height: 70px;
        padding: 5px;
        overflow: hidden;
        background-color: LightBlue;
        display: -ms-grid;
    }
}

希望这次有所帮助;)

答案 1 :(得分:0)

我的一般想法是在捕捉视图中切换模板以避免使用MyCellSpanningJSTemplate来调整项目模板的大小。你可以尝试一下。

1)创建第二个项目模板:

    <div id="listLayoutItemTemplate" data-win-control="WinJS.Binding.Template" style="display: none">
        <div class="regularListIconItem">
            <img src="#" class="regularListIconItem-Image" data-win-bind="src: picture" />
        </div>
    </div>

2)通过收听调整大小事件来检测捕捉的视图(请参阅http://code.msdn.microsoft.com/windowsapps/Snap-Sample-2dc21ee3

3)以编程方式将模板更改为步骤1中创建的模板。

var listView = document.querySelector("#listView").winControl;
listView.itemTemplate = listLayoutItemTemplate;