用于UWP的TemplateSelector FlipView

时间:2017-08-08 15:13:38

标签: templates mvvm uwp flipview

我已经创建了一个Xamarin.Forms UWP应用程序,当我试图通过游泳穿越地中海时,它感觉就像一个装满水泥的水桶。所以我切换到原生的UWP编程。

我的应用程序动态创建为95%。页面上的所有页面控件都取决于数据库中保存的内容。

我有一个登录页面,一个carouselPage(FlipView)和一个QuitPage。

所有其他页面都动态加载并添加到FlipView-ItemsSource。

在Xamarin中我有一个类似于此链接中的TemplateSelector: https://github.com/alexrainman/CarouselView/blob/master/Demo/Views/MyTemplateSelector.cs

我的问题是: 如何从我的Views / Pages中动态创建DateTemplates?

顺便说一句: 我从Xamarin转为原生,因为性能问题严重。 Carousel每次都会切换到第一项,并且在更改尺寸后(通过虚拟键盘)需要几秒钟再次显示“实际”页面。

如果列表中有超过30个项目,我希望找到一个没有这些性能问题的解决方案。

也许有人可以解释为什么会出现这样的性能问题?我无法相信每个页面都会因虚拟kb改变的大小而重新加载。

提前谢谢大家。

编辑:

找到编辑按钮后,这是我到目前为止所得到的:

我有一个名为CarouselView的页面。在Xaml中,我有一个名为“myCarousel”的FlipView。

在CodeBehind中我有以下代码:

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...

这是StackTrace:

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)

编辑: 使用“new MyView()。Content.ToString()”我只获得该类型的名称。例如“Windows.Ui.Xaml.Controls.Grid”。

所以我似乎需要从视图中提取xaml并将其转换为字符串。

编辑编辑编辑编辑:

以下代码的UWP等价物是什么?

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

1 个答案:

答案 0 :(得分:0)

尝试创建模板而不是xaml-Files。只需将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!
            }

并按照以下方式返回您的模板:

protected override DataTemplate SelectTemplateCore(object item,DependencyObject container){             var TemplateType = item.GetType();

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

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

第一个代码示例中的类Templates.DataTemplates()如下所示:

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

它的xaml包含你的DataTemplates。

希望,这有帮助。