2017-08-08 68 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。

希望,这有助于。