我想实现两个功能:
我已经实现了,但是组合有问题
在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
}
不起作用。
我认为,如果我想要更改大小,更改大小代码必须与更改视图代码无关。
因为当我更改GridView的ItemsPanel时,我的GridView的ItemsPanelRoot将为null。
如果你改变了ItemsPanel
的GridView
,ItemsPanel
成为ItemsStackPanel
对象,而不是ItemsWrapGrid
对象。所以你不能得到一个ItemsWrapGrid
对象,但GridView的ItemsPanelRoot
不是null,它是一个ItemsStackPanel
。
ItemsStackPanel appItemsPanel = (ItemsStackPanel)girdView.ItemsPanelRoot;
更改GridView项目大小
但ItemsStackPanel
没有直接设置物品高度和宽度的属性ItemsWrapGrid
。实际上无论当前设置哪个ItemsPanel
,你总是可以使用VisualTreeHelper
获得GridViewItem
s并设置高度和宽度属性。例如:
private void btnchangesize_Click(object sender, RoutedEventArgs e)
{
IEnumerable<GridViewItem> items = FindVisualChildren<GridViewItem>(girdView);
foreach (var item in items)
{
item.Height = 80;
item.Width = 100;
}
}
private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}