更改GridView项目大小

时间:2018-03-18 01:59:06

标签: c# gridview uwp

我想实现两个功能:

  1. 将GirdView更改为Listview。

  2. 用户可以更改项目大小。

  3.   

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

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

    也不起作用。

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

1 个答案:

答案 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