我想实现两个功能:
将GirdView更改为Listview。
用户可以更改项目大小。
我已经实现了,但是有组合问题
在xaml中,我有两个ItemsPanelTemplate
:
<!--Two mode-->
<ItemsPanelTemplate x:Key="ItemsStackPanelTemplate">
<ItemsStackPanel />
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="ItemsWrapGridTemplate">
<ItemsWrapGrid Orientation="Horizontal"/>
</ItemsPanelTemplate>
在代码中,我有一个更改视图的按钮:
if(Viewstatus == "GridView")
{
//now it is gridview, then change to listview
girdView.ItemsPanel = this.Resources["ItemsStackPanelTemplate"] as ItemsPanelTemplate;
girdView.ItemTemplate = this.Resources["listviewdata"] as DataTemplate;
Viewstatus = "ListView";
}
else
{
girdView.ItemsPanel = this.Resources["ItemsWrapGridTemplate"] as ItemsPanelTemplate;
girdView.ItemTemplate = this.Resources["BookDataTemplate"] as DataTemplate;
Viewstatus = "GridView";
}
我有一个更改大小的函数代码(myTitle
是一个保存某些状态的对象):
ItemsWrapGrid appItemsPanel = (ItemsWrapGrid)girdView.ItemsPanelRoot;
if(myTitle != null)
{
appItemsPanel.ItemWidth = myTitle.ZoomValue;
appItemsPanel.ItemHeight = myTitle.ZoomValue + 20;
zoom = myTitle.ZoomValue;
}
两者都是正常的,但是当我改变观点时,我无法改变大小;
因为当我更改了GridView的ItemsPanel时,我的GridView的ItemsPanelRoot将为null。
所以我无法获得girdView.ItemsPanelRoot
。
我该怎么办?我怎么能同时拥有这两个功能?我的方式是错的?
更新:谢谢标记答案。
但我有一个新问题:
在changeView方法中,我遇到了代码问题:
if(Viewstatus == "GridView")
{
//now it is gridview, then change to listview
girdView.ItemsPanel = this.Resources["ItemsStackPanelTemplate"] as ItemsPanelTemplate;
girdView.ItemTemplate = this.Resources["listviewdata"] as DataTemplate;
IEnumerable<Grid> items = VisualTreeHelperClass.FindVisualChildren<Grid>(girdView);
foreach (var item in itemsa)
{
if(item.Name == "myGrid")
item.Width = myTitle.Framesize;
}
Viewstatus = "ListView";
}
else
{
girdView.ItemsPanel = this.Resources["ItemsWrapGridTemplate"] as ItemsPanelTemplate;
girdView.ItemTemplate = this.Resources["BookDataTemplate"] as DataTemplate;
Viewstatus = "GridView";
}
我失败了。(myGrid
是模板中的网格名称,如果我不这样做,它将改变View的所有宽度。我试图删除if(item.Name == "myGrid")
,它改变了一些其他视图的宽度,我在Debug.WriteLine中看到了它
但我有另一种方法,我调用该方法来运行相同的代码,这是工作。
所以我认为:
如果我改变观点并立即找到视图的孩子(一种方法中的两件事),我将失败。
如果我改变视图,我会做一些事情来调用另一种方法,它会起作用。
我试图使用:
public void ChangeView(){
//code that change view
.........
ChangeSize();
}
public void ChangeSize(){
//find child and change size code
}
也不起作用。
我认为,如果我想要更改大小,更改大小代码必须与之无关 更改视图代码。
答案 0 :(得分:0)
因为当我更改了GridView的ItemsPanel时,我的GridView的ItemsPanelRoot将为null。
如果您更改了ItemsPanel
的{{1}},GridView
将成为ItemsPanel
对象,而不是ItemsStackPanel
对象。因此,您无法获得ItemsWrapGrid
个对象,但GridView的ItemsWrapGrid
不为空,而是ItemsPanelRoot
。
ItemsStackPanel
更改GridVew项目大小
但是ItemsStackPanel appItemsPanel = (ItemsStackPanel)girdView.ItemsPanelRoot;
没有直接设置ItemsStackPanel
项目高度和宽度的属性。实际上,无论当前设置了哪个ItemsWrapGrid
,您始终可以使用VisualTreeHelper
获取ItemsPanel
并设置高度和宽度属性。例如:
GridViewItem