2017-03-17 18 views
2

ロングストーリー。UWP - XamlテンプレートなしのGridView

私はGridViewを含むUWP UIを持っており、Xamlは使用していません。コードビハインドの構築されたアイテムを完全に表示したいと思います。 Xamlテンプレートはありません。

GridViewのChoosingItemContainerイベントにより、GridViewItemインスタンスをプログラムで作成し、場合によってはそれらを再利用することさえできることがわかりました。

ただし、アイテムのカスタムUIは実際には表示されません。

大量のデータをスクロールすると、コンテンツが非常に短く表示されて消えてしまうことに気付きました。私は、GridViewItemのコンテンツが何らかの種類のデフォルトテンプレートによって上書きされていると推測しています。この機械を無効にする方法はありますか?

もっと一般的に言えば、Xamlを使用しないGridView + Itemsを使用する既知の方法はありますか?

UPDATE:ここ

は、問題を示し、最小限のコードサンプルです。 UIのどこかに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 =(スタイル)リソース["res"]を取得できます。コード内。

はXAMLでスタイルを使用するには、コードの参照にスタイルを設定することができますway.But良いです:

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

GridView.Style=style ; 

スタイルはGridViewコントロールとちょうどXAMLのような項目を設定することができます。

あなたは、私があなたにコードを与えることができないことをあなたが望んでいるとは言いません。

関連する問題