我有一个WinJs metro应用程序,其中包含ListView
项,其中包含可变高度的项目。它基本上与"HTML ListView item templates" sample中的场景4中的方式相同。 groupInfo
函数用于启用与ListView关联的GridLayout
的单元格显示:
现在,在我的应用程序的快照视图中,我希望项目可以垂直滚动,因此我尝试将GridLayout
替换为ListLayout
。这会导致垂直滚动,但现在缺少单元格并且项目重叠:
我使用groupInfo
函数的方式与GridLayout
相同,但似乎被忽略了:
layout: {
groupInfo: groupInfo,
type: WinJS.UI.ListLayout
}
有没有办法在ListLayout
中使用可变大小的项目?我的一些项目比其他项目更多内容,我真的想使用不同大小的瓷砖以最佳方式显示所有内容。
答案 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;