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;
}
}
}
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
Ich habe die Frage mit einem minimalen Beispiel aktualisiert. – Pragma