2017-03-17 16 views
2

Lange Geschichte kurz.UWP - GridView ohne Xaml Vorlagen

Ich habe eine UWP UI, die eine GridView enthält und Xaml nicht verwendet. Ich möchte vollständig Code-Behind konstruierte Elemente anzeigen. Keine Xaml-Vorlagen.

Ich habe herausgefunden, dass das GridView-Ereignis "ChoingItemContainer" es mir erlaubt, die GridViewItem-Instanzen programmgesteuert zu erstellen und sogar möglicherweise wiederzuverwenden.

Die benutzerdefinierte Benutzeroberfläche der Elemente wird jedoch nicht tatsächlich angezeigt.

Ich habe festgestellt, dass beim Scrollen einer großen Datenmenge der Inhalt sehr kurz erscheint und dann verschwindet. Ich vermute, dass der Inhalt des GridViewItems von einer Art Standardvorlage überschrieben wird. Gibt es eine Möglichkeit, diese Maschinen zu deaktivieren?

Gibt es allgemein eine Möglichkeit, GridView + -Elemente ohne Xaml zu verwenden?

UPDATE:

Hier ist ein minimales Codebeispiel, das das Problem veranschaulicht. Platzieren Sie die CustomGridView irgendwo in Ihrer Benutzeroberfläche.

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

Können Sie zeigen, wie Sie "GridViewItems" zu "GridView" hinzufügen? Ohne Ihren Code gibt es keine Möglichkeit herauszufinden, was das Problem ist und warum es passiert. Bitte sehen Sie [mcve] – AVK

+0

Ich habe die Frage mit einem minimalen Beispiel aktualisiert. – Pragma

Antwort

0

Für Sie benutzerdefinierte UI durch neue einen Stil zu setzen.

Sie können die Ressource in Xaml festlegen und geben Sie einen Schlüssel, wie "res".

Und Sie können GridView.Style = (Stil) Ressourcen ["res"]; in Code.

Um Stil in XAML zu verwenden ist eine gute way.but Sie Stil in Code siehe einstellen:

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

GridView.Style=style ; 

Der Stil dieser ebenso wie die XAML-Gridview und Gegenstände werden können.

Sie haben nichts zu sagen, was Sie wollen, dass ich kann Ihnen keinen Code geben.

Verwandte Themen