2017-03-17 76 views
2

長話短說。UWP - 沒有Xaml模板的GridView

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

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

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

我注意到,滾動大量數據時,內容顯示非常簡短,然後消失。我猜測GridViewItem的內容正在被某種默認模板覆蓋。有沒有辦法禁用這個機器?

更一般地說,有沒有一種已知的方式來使用沒有Xaml的GridView + Items?

UPDATE:

下面是一個說明該問題的最小代碼示例。 將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; 
     } 

    } 
} 
+0

你能告訴你如何將'GridViewItems'添加到'GridView'嗎?沒有你的代碼,就沒有辦法找出問題所在,以及爲什麼會發生。請參閱[mcve] – AVK

+0

我已用最小的示例更新了該問題。 – Pragma

回答

0

因爲你可以通過新的風格來自定義UI設置。

您可以在xaml中設置資源,並給它一個鍵,如「res」。

你可以得到GridView.Style =(Style)Resources [「res」];在代碼中。

要在XAML中使用的風格是一個很好的way.But您可以在代碼參見設置樣式:

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

GridView.Style=style ; 

的風格可以設置GridView和項目就像XAML。

你不知道你想要什麼,我不能給你一個代碼。