更改GridView项目大小

问题描述 投票:2回答:1

我想实现两个功能:

  1. 将GridView更改为Listview。
  2. 用户可以更改项目大小。

我已经实现了,但是组合有问题

在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
}

不起作用。

我认为,如果我想要更改大小,更改大小代码必须与更改视图代码无关。

c# gridview uwp
1个回答
0
投票

因为当我更改GridView的ItemsPanel时,我的GridView的ItemsPanelRoot将为null。

如果你改变了ItemsPanelGridViewItemsPanel成为ItemsStackPanel对象,而不是ItemsWrapGrid对象。所以你不能得到一个ItemsWrapGrid对象,但GridView的ItemsPanelRoot不是null,它是一个ItemsStackPanel

ItemsStackPanel appItemsPanel = (ItemsStackPanel)girdView.ItemsPanelRoot;

更改GridView项目大小

ItemsStackPanel没有直接设置物品高度和宽度的属性ItemsWrapGrid。实际上无论当前设置哪个ItemsPanel,你总是可以使用VisualTreeHelper获得GridViewItems并设置高度和宽度属性。例如:

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;
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.