UWPs FlipView 的模板选择器
TemplateSelector for UWPs FlipView
我创建了一个 Xamarin.Forms UWP 应用程序,当我试图通过游泳穿越地中海时,它对我来说就像脚上装满了水泥桶。所以我切换到原生 UWP 编程。
我的应用程序已动态创建到 95%。页面上的所有页面控件都取决于数据库中保存的内容。
我有一个登录页面、一个轮播页面 (FlipView) 和一个退出页面。
所有其他页面都动态加载并添加到 FlipView-ItemsSource。
在 Xamarin 中,我有一个类似 link 中的 TemplateSelector:
https://github.com/alexrainman/CarouselView/blob/master/Demo/Views/MyTemplateSelector.cs
我的问题是:
如何从我的 Views/Pages 中动态创建 DateTemplates?
顺便说一句:
我从 Xamarin 切换到原生,因为存在严重的性能问题。 Carousel 每次都会切换到第一个项目,并且在更改大小(通过虚拟键盘)后需要几秒钟才能再次显示 "actual" 页面。
当列表中的项目超过 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()
} // 结束class 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>) };
尝试创建您的模板而不是 xaml-文件。只需将模板内容复制到新 Resources.Xaml.
中的 xaml-DataTemplate
然后像这样创建您的模板选择器:
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!
}
并且 return 你的模板是这样的:
受保护的覆盖 DataTemplate SelectTemplateCore(对象项,DependencyObject 容器){
var 模板类型 = 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 包含您的数据模板。
希望这对您有所帮助。
我创建了一个 Xamarin.Forms UWP 应用程序,当我试图通过游泳穿越地中海时,它对我来说就像脚上装满了水泥桶。所以我切换到原生 UWP 编程。
我的应用程序已动态创建到 95%。页面上的所有页面控件都取决于数据库中保存的内容。
我有一个登录页面、一个轮播页面 (FlipView) 和一个退出页面。
所有其他页面都动态加载并添加到 FlipView-ItemsSource。
在 Xamarin 中,我有一个类似 link 中的 TemplateSelector: https://github.com/alexrainman/CarouselView/blob/master/Demo/Views/MyTemplateSelector.cs
我的问题是: 如何从我的 Views/Pages 中动态创建 DateTemplates?
顺便说一句: 我从 Xamarin 切换到原生,因为存在严重的性能问题。 Carousel 每次都会切换到第一个项目,并且在更改大小(通过虚拟键盘)后需要几秒钟才能再次显示 "actual" 页面。
当列表中的项目超过 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()
} // 结束class 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>) };
尝试创建您的模板而不是 xaml-文件。只需将模板内容复制到新 Resources.Xaml.
中的 xaml-DataTemplate然后像这样创建您的模板选择器:
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!
}
并且 return 你的模板是这样的:
受保护的覆盖 DataTemplate SelectTemplateCore(对象项,DependencyObject 容器){ var 模板类型 = 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 包含您的数据模板。
希望这对您有所帮助。