【发布时间】:2019-02-23 00:10:28
【问题描述】:
我要实现两个功能:
将 GridView 更改为 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;
}
两个都是正常的,但是当我换了views的时候就不能改变size了;
因为当我更改了 GridView 的 ItemsPanel 时,我的 GridView 的 ItemsPanelRoot 为空。
所以我无法获得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 是模板中的网格名称,如果我不这样做,它将改变视图的所有宽度。我尝试删除 if(item.Name == "myGrid"),它会改变一些其他视图的宽度,我在 Debug.WriteLine 中看到了)
但是我有另一种方法,我调用该方法来运行相同的代码,它可以工作。
所以我认为:
如果我更改视图并立即找到视图的子视图(两种方法合二为一),我将失败。
如果我改变视图,我会做一些事情来调用另一个方法,它会起作用。
我尝试使用:
public void ChangeView(){
//code that change view
.........
ChangeSize();
}
public void ChangeSize(){
//find child and change size code
}
也不行。
我想,如果我想改变尺寸,改变尺寸代码必须与 更改视图代码。
【问题讨论】: