2017-08-08 77 views
0

我創建了一個Xamarin.Forms UWP應用程序,它讓我感覺像一隻試圖穿過地中海游泳的腳上滿是水泥的桶。所以我轉而使用原生UWP編程。用於UWPs的TemplateSelector FlipView

我的應用程序被動態創建爲95%。頁面上的所有頁面控件都依賴於數據庫中保存的內容。

我有一個登錄頁面,一個carouselPage(FlipView)和一個QuitPage。

所有其他頁面都被動態加載並添加到FlipView-ItemsSource中。

在Xamarin我有喜歡的人在這個鏈接TemplateSelector: https://github.com/alexrainman/CarouselView/blob/master/Demo/Views/MyTemplateSelector.cs

我的問題是: 我如何動態地創建DateTemplates了我的意見/頁的?

順便說一句: 我從Xamarin切換到本機,因爲有嚴重的性能問題。輪播每次切換到第一個項目,並且需要幾秒鐘才能在更改大小(通過虛擬鍵盤)後再次顯示「實際」頁面。

我希望在列表中有超過30個項目時沒有此類性能問題的解決方案。

也許有人可以解釋爲什麼有這樣的性能問題?我不能相信每個頁面都會因虛擬kb改變的大小而重新加載。

謝謝大家提前。

編輯:

後,我發現編輯按鈕,這是我走到這一步:

我有一個名爲輪播畫面頁。在Xaml中,我將FlipView命名爲「myCarousel」。

在代碼隱藏我有以下代碼:

public partial class WellcomeView : BasePage { 
#region Fields + Properties 
private int _position; 
public int Position { get { return _position; } set { _position = value; } } 
#endregion 

public CarouselView() { 
    InitializeComponent(); 
    myCarousel.ItemTemplateSelector = new MyTemplateSelector(); 
    DataContext = new WellcomeViewModel(null, null, null, null, null); 
} 

public class MyTemplateSelector : Windows.UI.Xaml.Controls.DataTemplateSelector { 
    private DataTemplate GreetingTemplate; 
      ... 

    public MyTemplateSelector() { 
     this.GreetingTemplate = (DataTemplate)Windows.UI.Xaml.Markup.XamlReader.Load(new GreetingView().Content.ToString()); 
     ... 
     // Here it throws an error. No matter if MainPage (with content) or other Views (with Content==null). But in every case I get a XamlParseException. 
    } // End Ctor 

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { 
     var TemplateType = item.GetType(); 
     switch (TemplateType.Name) { 
      case "GreetingViewModel": 
      return base.SelectTemplateCore(GreetingTemplate); 

      default: 
      return base.SelectTemplateCore(BegruessungTemplate); 
     } // End switch-case 
    } // End SelectTemplateCore() 
} // End MyTemplateSelector() 

} //結束類WellcomeView

Here's the Error I get...

而這裏的堆棧跟蹤:

at Windows.UI.Xaml.Markup.XamlReader.Load(String xaml) 
    at MEDePORT_Win_Native.Views.WellcomeView.MyTemplateSelector..ctor() 
    at MEDePORT_Win_Native.Views.WellcomeView..ctor() 
    at MEDePORT_Win_Native.MEDePORT_Win_Native_XamlTypeInfo.XamlTypeInfoProvider.Activate_11_WellcomeView() 
    at MEDePORT_Win_Native.MEDePORT_Win_Native_XamlTypeInfo.XamlUserType.ActivateInstance() 
    at Windows.UI.Xaml.Controls.Frame.Navigate(Type sourcePageType, Object parameter) 
    at MEDePORT_Win_Native.App.OnLaunched(LaunchActivatedEventArgs e) 

編輯: 使用「新的MyView()。Content.ToS tring()「我只知道類型的名稱。例如「Windows.Ui.Xaml.Controls.Grid」。

所以看起來我需要從視圖中提取xaml並將其轉換爲字符串。

編輯編輯編輯編輯編輯:

什麼是UWP等同於下面的代碼?

DataTemplate template = new DataTemplate { DataType = typeof(< Type of the object the template refers>) }; 
+0

UWP也有[DataTemplateSelector](https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.datatemplateselector)。 – Scavenger

+0

@清道夫是的,這是真的,但我沒有找到任何功能的解決方案。 我在網上看到過這樣的東西: private DataTemplate FilmTemplate; ());我們可以使用這個方法來創建一個新的MovieView()。 } 但我得到除MainPage以外的每個頁面/ ContentView的NullReferences。看來,Xaml的「內容」沒有加載,但我不明白爲什麼。 如果我可以編輯我的開幕帖子,我會添加我目前的「解決方案」以便更好地理解。 謝謝。 –

+0

你應該可以編輯你自己的問題。請將代碼添加到您的問題中,[mcve]可能會更有幫助。 – Scavenger

回答

0

嘗試創建您的模板而不是xaml文件。只需將Template-content複製到新的Resources.Xaml中的xaml-DataTemplate即可。

然後創建你的TemplateSelector這樣的:

public class MyTemplateSelector : DataTemplateSelector { 
      public DataTemplate GreetingTemplate; 
      static ResourceDictionary dataTemplates; 

      public MyTemplateSelector() { 
       if (dataTemplates == null) { 
        dataTemplates = new Templates.DataTemplates(); 
       } 

       GreetingTemplate = dataTemplates["GreetingTemplate"] as DataTemplate; // Look how to load Your Templates! 
      } 

,並返回你的模板是這樣的:

保護覆蓋的DataTemplate SelectTemplateCore(對象項目,DependencyObject的容器){VAR = TemplateType item.GetType() ;

 switch (TemplateType.Name) { 
      case "GreetingViewModel": 
       return GreetingTemplate; 

      default: 
       return base.SelectTemplateCore(GreetingTemplate); 
     } 
    } 

的Class Templates.DataTemplates()從第一個代碼示例如下:

public partial class DataTemplates : ResourceDictionary { 
     public DataTemplates() { 
      InitializeComponent(); 
     } 
    } 

,它的XAML包含您的DataTemplates。

希望,這有助於。