在GridView中动态更改磁贴的大小? [英] Dynamically change size of tile in GridView?
问题描述
如何在选择后更改GridView中所选图块的大小?我希望能够通过使瓷砖更大并使用不同的数据模板来显示所选项目的更多数据?谢谢!
通过执行下面列出的步骤来实现此目的。但是,每次选择项目时都必须将模板重新应用于每个GridViewItem这一事实使得转换非常缓慢,尤其是当项目数量很大时。如果有人为此提出更好的解决方案,我会非常感激它!:)
无理想解决方案:
1。使用VariableSizedWrapGrid。 ( http://leeontech.wordpress.com/2012/ 03/01 / customizing-gridview-items-in-metro-app-4 / )这样就可以在同一个GridView中显示不同
大小的磁贴。
2。使用DataTemplateSelector( http://babaandthepigman.wordpress.com/2012/02/08/datatemplateselector-winrt/ )将不同的数据模板应用于所选的图块。
我在类中添加了一个额外的属性,用作数据绑定的数据源,以指示是否选中了它的tile。我的DataTemplateSelector类看起来像这样:public class PTemplateSelector:DataTemplateSelector
{
public DataTemplate PatientGridTemplate {get;组; }
public DataTemplate ExpandedPatientGridTemplate {get;组; }
protected override DataTemplate SelectTemplateCore(object item,DependencyObject container)
{
患者患者=项目为患者;
if(patient.Selected == true)
return ExpandedPatientGridTemplate;
else
返回PatientGridTemplate;
}
}
3。添加OnSelectionChanged处理程序。仅当gridview的数据模板设置为null时,DataTemplateSelector才会重新运行
private void GridView_SelectionChanged(object sender,SelectionChangedEventArgs e)
{
患者患者= e.AddedItems [0]作为患者;foreach(患者p在App.PList.Patients中)
{
p.Selected = false;
}
patient.Selected = true;
GridView grd = sender作为GridView;
if(grd!= null)
{
GridViewItem gvi = grd.ItemContainerGenerator.ContainerFromItem(patient)as GridViewItem;
if(gvi!= null)
{
//重置模板,以便模板选择器重新运行,根据网格状态选择合适的模板
// 。
grd.ItemTemplate = null;
grd.ItemTemplateSelector = this.Resources [" cdst"] as DataTemplateSelector;
}
}
}
$
How do I change the size of the selected tile in GridView after it's selected? I want to be able to show more data about the selected item via makingthe tile bigger and using a different data template for that one selected tile? Thank you!
Managed to achieve that by doing the steps listed below. However, the fact that the template has to be re-applied to every single GridViewItem every time an item is selected makes the transition very slow especially when the number of items is large. I would greatly appreciate it if someone comes up with a better solution for this!:)
None-ideal solution:
1. Use VariableSizedWrapGrid. (http://leeontech.wordpress.com/2012/03/01/customizing-gridview-items-in-metro-app-4/) This is so that tiles of different sizes can be displayed in the same GridView.
2. Use DataTemplateSelector (http://babaandthepigman.wordpress.com/2012/02/08/datatemplateselector-winrt/) to apply a different data template to the tile that's selected. I added an extra property to the class that I use as data source for data-binding to indicate whether its tile is selected. My DataTemplateSelector class looks something like this:
public class PTemplateSelector : DataTemplateSelector { public DataTemplate PatientGridTemplate { get; set; } public DataTemplate ExpandedPatientGridTemplate { get; set; } protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { Patient patient = item as Patient; if (patient.Selected == true) return ExpandedPatientGridTemplate; else return PatientGridTemplate; } }3. Add OnSelectionChanged handler. DataTemplateSelector will re-run only if the data template of the gridview is set to null
private void GridView_SelectionChanged(object sender, SelectionChangedEventArgs e) { Patient patient = e.AddedItems[0] as Patient;
foreach (Patient p in App.PList.Patients) { p.Selected = false; } patient.Selected = true; GridView grd = sender as GridView; if (grd != null) { GridViewItem gvi = grd.ItemContainerGenerator.ContainerFromItem(patient) as GridViewItem; if (gvi != null) { // reset template so that the template selector will re-run to select appropriate template // according to the state of the grid. grd.ItemTemplate = null; grd.ItemTemplateSelector = this.Resources["cdst"] as DataTemplateSelector; } } }
这篇关于在GridView中动态更改磁贴的大小?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!