簡體   English   中英

UWP-沒有Xaml模板的GridView

[英]UWP - GridView without Xaml templates

長話短說。

我有一個UWP UI,其中包含GridView,並且不使用Xaml。 我想顯示完全代碼隱藏的構造項。 沒有Xaml模板。

我發現GridView的ChoosingItemContainer事件將允許我以編程方式創建GridViewItem實例,甚至可能重用它們。

但是,這些項的自定義用戶界面實際上並未顯示。

我已經注意到,滾動大量數據時,內容會非常短暫地出現然后消失。 我猜想GridViewItem的內容正在被某種默認模板覆蓋。 有沒有辦法禁用此機器?

更籠統地說,有沒有使用Xaml的GridView + Items的已知方法?

更新:

這是演示該問題的最小代碼示例。 將CustomGridView放在用戶界面中的某個位置。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Media;

namespace MyApp
{
    // Some kind of data object
    public class MyData
    {
        public string MyProperty;
    }

    // A custom GridViewItem
    public class MyGridViewItem : GridViewItem
    {
        private TextBox mTextBox;

        public MyGridViewItem()
        {
            mTextBox = new TextBox();

            mTextBox.Width = 100;
            mTextBox.Height = 100;

            Content = mTextBox;

            // Make the items visible at all: use red background
            Background = new SolidColorBrush(Color.FromArgb(255,255,0,0));
        }

        public void SetData(MyData d)
        {
            mTextBox.Text = d.MyProperty;

            // Content seems to be always reset to the data object itself.
            Content = mTextBox;

            // With the following line the contents appear briefly while the view is scrolling.
            // Without this line the contents don't appear at all
            Template = null;
        }
    }

    // Custom grid. No Xaml.
    public class CustomGridView : GridView
    {
        public CustomGridView()
        {
            this.ChoosingItemContainer += CustomGridView_ChoosingItemContainer;

            // Create some data to show.
            CollectionViewSource s = new CollectionViewSource();
            ObservableCollection<MyData> oc = new ObservableCollection<MyData>();

            for(int i = 0;i < 10000;i++)
            {
                MyData d = new MyData();
                d.MyProperty = i.ToString();
                oc.Add(d);
            }

            s.Source = oc;
            ItemsSource = s.View;
        }

        private void CustomGridView_ChoosingItemContainer(ListViewBase sender,ChoosingItemContainerEventArgs args)
        {
            // Unchecked cast, but for the sake of simplicity let's assume it always works.
            MyData d = (MyData)args.Item;

            MyGridViewItem it = null;

            if((args.ItemContainer != null) && (args.ItemContainer.GetType() == typeof(MyGridViewItem)))
                it = (MyGridViewItem)args.ItemContainer;
            else
                it = new MyGridViewItem();

            it.SetData(d);

            args.ItemContainer = it;
            args.IsContainerPrepared = true;

            // This should probably go elsewhere, but for simplicity it's here :)
            ((ItemsWrapGrid)ItemsPanelRoot).ItemWidth = 100;
            ((ItemsWrapGrid)ItemsPanelRoot).ItemHeight = 100;
        }

    }
}

您可以通過設置新樣式來自定義UI。

您可以在xaml中設置資源,並給它一個密鑰,例如“ res”。

並且您可以獲得GridView.Style =(Style)Resources [“ res”]; 在代碼中。

在xaml中使用樣式是一種好方法。但是您可以在代碼中設置樣式,請參見:

Style style = new Style(typeof (GridView));
style.Setters.Add(new Setter(GridView.Property, xx));

GridView.Style=style ;

可以像設置xaml一樣設置樣式的GridView和Items。

你沒有說我想要的用戶界面我不能給你一個代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM