UI野路子 --- 【二】ItemsControl

qiqiminmin UID.638527
2015-12-19 发表

本帖最后由 qiqiminmin 于 2015-12-19 22:09 编辑

这个帖子我来讨论讨论itemsControl,( ̄▽ ̄)",只是介绍,个人观点,个人经验,我自己很受用的。
itemsControl应用很广泛,很久以前,论坛有人还惊诧的跟我说,你怎么还用ItemsControl, 用ListView或ListBox都好一些。其实ListView和ListBox都是ItemsControl. 个人喜欢,不太喜欢ListBox和ListView的限制,所以一直用itemsControl.

想到之前有一个关于淘宝html5版本的争论,还有个帖子利用json数据说各个平台差不多都是一样的。

其实有个误区,josn数据只是数据,显示出来的效果就千差万别了,为什么?其实还是取决是显示的UI的人以及显示的平台(其实Windows 10的html5上,在svg,httpCilent等方面都有一些问题或者bug),客户端的数据相对于服务端的数据说白了,是非常容易的,有的软件甚至不保存到本地,全部实时获取。 为什么唯独Windows Runtime平台总是觉得缺啥。应该讲是ItemsControl以及 数据的Binding上的天生不足,正因为不足所以就要引起足够的重视了。

还有之前我一个帖子有人提到,界面都是美工画好,然后程序员在VS中调位置。如果都这么做,那么json变化,UI也要变化了,其实在实际的UI编程中,都是尽量搭建一个数据可以显示的平台,要做到,最后数据自己找到自己要显示的地方。VS中编写Xaml最好只做个模板. 我在VS里编号XAML之后一般长这个样子,对,其实啥都没有。
***附件停止解析***



首先我们来假设我们的json数据叫做showCase
{
title:'所有数据';
data_body:[
{
id:'1',
show_case_title:'今日更新',
items:[
{
title:'课本1',
image:'1.jpg'
},
{
title:'课本1',
image:'1.jpg'
}
]
},
{
show_case_title:'烤鸭中心',
items:[''],}........
];

}.....


看到这里,一定要一开始就抓住Array,还有互相嵌套。在html5中,可以这样
[mw_shl_code=html,true]<div ng-repeat="n in data_body">
<div >{{n.show_case_title}}</div>
<div ng-repeat="m in n.items">
<img ng-src={{m.image}}>
<div>{{m.title}}</div>
</div>
</div>[/mw_shl_code]
简洁,方便。

但没办法,还是要在Xaml中实现。记得使用itemsCongtrol要设置 itemsSource哦, 可以binding,也可是手工设置,但是嵌套的第二个itemsControl只需Binding即可
[mw_shl_code=html,true]<ItemsControl VirtualizingStackPanel.VirtualizationMode="Recycling" x:Name="showCase">
<ItemsControl.ItemContainerTransitions>
<TransitionCollection>
<EntranceThemeTransition IsStaggeringEnabled="True" FromVerticalOffset="0"
FromHorizontalOffset="-100">

</EntranceThemeTransition>

</TransitionCollection>
</ItemsControl.ItemContainerTransitions>
<ItemsControl.ItemTemplate>
<DataTemplate >
<Grid Margin="15">
<StackPanel>
<Grid Margin="0 5">
<Border BorderBrush="{StaticResource main-color}" BorderThickness="5 0 0 0"></Border>
<Viewbox VerticalAlignment="Center" Height="20" Margin="10 0 0 0" HorizontalAlignment="Left">
<TextBlock Style="{StaticResource tabText}" Text="{Binding header.title}"></TextBlock>
</Viewbox>
<Viewbox VerticalAlignment="Center" Height="20" Margin="10 0 0 0" HorizontalAlignment="Right">
<TextBlock Foreground="Gray" Text="{Binding header.indicator}"></TextBlock>
</Viewbox>
</Grid>


<ItemsControl ItemsPanel="{Binding id,Converter={StaticResource itemToTemplate},ConverterParameter=panel}" ItemTemplate="{Binding id,Converter={StaticResource itemToTemplate},ConverterParameter=data}" ItemsSource="{Binding body.items}" >

</ItemsControl>

</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
[/mw_shl_code]

也许大家就简单认为,也就是显示一些图和字啦,没什么。
问题就在这里,其实第一层Array,可能有不同的showCase, 不同的showCase会有不同的显示方法。

有竖着排列的,有一排三个的
***附件停止解析***

还有一排两个的
***附件停止解析***

这是怎么弄得?所以要熟练的绑定ItemTemplate,和ItemPanel的binding.还有最重要的一点 valueConventer.
<ItemsControl ItemsPanel="{Binding id,Converter={StaticResource itemToTemplate},ConverterParameter=panel}" ItemTemplate="{Binding id,Converter={StaticResource itemToTemplate},ConverterParameter=data}" ItemsSource="{Binding body.items}" >
</ItemsControl>

只要设置好数据中的类别,只要能区分,那么就可以通过valueConventer设置自己需要的东西了。一般长这个样子,我建议只写一个 Conventer,多次利用Parameter得到自己想要的东西就行了。
[mw_shl_code=csharp,true]public object Convert(object value, Type targetType, object parameter, string language)
{
if (parameter.ToString() == "data")
{
if (value.ToString() == "new_episode" || value.ToString() == "new_course")
{

return App.Current.Resources["todayUpdate"];
}
else
{
return App.Current.Resources["normal"];
}
}
else if (parameter.ToString() == "todayText")
{
var item = value as Item;

return string.Format("{0:0.00} M",System.Convert.ToDouble(item.audio_file_size) / 1000);
}
else if (parameter.ToString() == "panel")
{

if (value.ToString() == "new_episode" || value.ToString() == "new_course")
{

return App.Current.Resources["stackPanel"];
}
else if (value.ToString().Trim() == "1")
{
return App.Current.Resources["bigWrapPanel"];
}
else
{
return App.Current.Resources["wrapPanel"];
}

}


return App.Current.Resources["normal"];

}
[/mw_shl_code]

剩下就是写Resources,( ̄▽ ̄)",希望这些对一些人能有启发,我的东西并不是说该怎么做,只是个人经验而已。Xaml功能还是蛮强大的,只有不勤奋的攻城狮和有限的项目进度才是拦路虎。
大概长这个样子。我本人是非常喜欢C#和Windows平台,但自跨平台开发以来,常常觉得有时候你要付出吃奶的劲,才能做去其他平台喝口水功夫的东西。心里总有一些不舍,但也发现,目前uwp平台的上开发,阻止html5发展更加快速发展的方法,也许只有继续让平台不完善。
[mw_shl_code=html,true]<ItemsPanelTemplate x:Key="bigWrapPanel">

<toolkit:UniformGrid Columns="2"></toolkit:UniformGrid>
</ItemsPanelTemplate>

<ItemsPanelTemplate x:Key="wrapPanel">
<toolkit:UniformGrid Columns="3"></toolkit:UniformGrid>
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="stackPanel">
<StackPanel>

</StackPanel>
</ItemsPanelTemplate>
[/mw_shl_code]

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
僕NO約束 UID.70212
2015-12-19 使用 Lumia 640 回复

本帖最后由 僕NO約束 于 2015-12-19 10:01 编辑

在app应用上,只要美工够prefect。都会给你做好足够的尺寸。做好点九图给你。不用你花费太大的心思。如果仅仅是调用代码的话。那你的ui就只能是单调的简朴的web样式。也就是程序员思维ui。如果你想你的ui吸引人,同时达到美的效果。一个美工很重要。除非你做的是游戏。注重固定比例。但明显游戏更需要美工,哈哈

Kevin笃笃 UID.940450
2015-12-19 回复

把自己的开发体验与大家分享,支持一下

qiqiminmin UID.638527
2015-12-19 回复

本帖最后由 qiqiminmin 于 2015-12-19 11:34 编辑

Quote***链接停止解析***
在app应用上,只要美工够prefect。都会给你做好足够的尺寸。做好点九图给你。不用你花费太大的心思。如果仅 ...


( ̄▽ ̄)"。。。。。 真羡慕有好美工的工程师。。。。。。

也许只是我个人的习惯吧,o(^▽^)o。。, 我一般是按比例。 Web样子是为了解释用的技术。像这个人体肌肉图,我都是用数据画出来的。都不是图片,也是基于各种比例。
***图片停止解析***

***图片停止解析***

vbfool UID.352791
2015-12-19 回复

其实不同内容变更模板,我更推荐DataTemplateSelector,选择器在这个时候还是挺管用的。

至于美工问题,其实是因为自己画实在是太丑了,你就算给我HTML5+CSS3,也不会好看到哪去啊。

qiqiminmin UID.638527
2015-12-19 回复

Quote***链接停止解析***
其实不同内容变更模板,我更推荐DataTemplateSelector,选择器在这个时候还是挺管用的。

至于美工问题,其 ...


我DataTeamplateSelector用得少,基本用Conventer.

不过按道理如果光改变应该是DataTeplateSelector更加正规一些。 ( ̄▽ ̄)",我只是习惯了Conventer。我什么都用Conventer. 其实肌肉图那一些在xaml里也能实现,我另一个帖子还介绍了如何运用canvas实现svg的显示效果。

vbfool UID.352791
2015-12-19 回复

本帖最后由 vbfool 于 2015-12-19 20:39 编辑

Quote***链接停止解析***
我DataTeamplateSelector用得少,基本用Conventer.

不过按道理如果光改变应该是DataTeplateSelector更 ...


选择器算是比较“官方”的做法吧,而且它是可以继承的,所以可以扩展的比较灵活。

顺便你那个SVG,我上次下载之后试了试,用ItemsControl+Canvas,模板里放Path来承载data,其实效果也不错来着。

k****e UID.1263313
2015-12-19 使用 Lumia Icon 回复

想学开发,有没有什么推荐的资料

qiqiminmin UID.638527
2015-12-19 回复

本帖最后由 qiqiminmin 于 2015-12-19 21:54 编辑

Quote***链接停止解析***
想学开发,有没有什么推荐的资料


学习微软的官方资料,应该是最好的。中文的教材的,翻译的词比较难懂,、 比如”面向对象”(OOP) 这个词,你很难想到是编程里的 class 有关,我语文不好,到现在我看到面向对象这四个字都头晕。
不过我建议
【1】学英语
【2】每天看微软的英文官方资料。

而且如果没有压力的话,很难学通编程.我工作前就已经编程许多年了,但是觉得入职的半年比我之前十年编程学的东西还多,是人的生存欲望逼自己学会的。可能要给自己点压力。

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报