在 UWP 的大小触发器中更改控件的父级
Change parent of a control in a size trigger in UWP
我正在创建一个 Windows 10 通用应用程序,我的主页中有两个面板。
在tablet/desktop模式下,两者同时可见(只是两个简单的Grid
,一个填充左侧,另一个填充右侧)
但是,在 phone 模式下,有一个枢轴,用户可以在面板之间滑动。
(我可以使用 SplitView 和汉堡菜单,它们在 Tablet/Desktop 和 Phone 模式下都很容易工作,但在我的情况下,枢轴更有意义)
所以,我目前所做的是,每个面板都有两个实例。 PhonePanel1
和 PhonePanel2
是我的枢轴控件的两个页面内的两个网格,TabletPanel1
和 TabletPanel2
是两个可以并排显示的网格。我使用 AdaptiveTrigger
s 来检测页面宽度并在这两种查看方法之间切换。
但是,每个面板都有两个实例并不是一个好方法,因为它们显示的内容基本相同。
有没有更好的方法来做到这一点?也许在触发器更改视图模式时更改 Grid 的父项?或者更好的东西?
你的方法没有错。为减少内存使用量,例如在 phone 上发生自适应触发时,将 TabletPanel1 和 TabletPanel2 的可见性设置为折叠。
如果所有面板都使用相同的数据上下文,则保持原样,如果不将折叠控件的数据上下文设置为空。
您可以将每个面板创建为用户控件,然后您只需定义一次内容,但每个控件都可以包含在您想要的每个布局中。
我能想到的更改父级的唯一方法是在后面编写一些代码,将它们呈现在新位置。一个合适的解决方案可能是将控件的加载推迟到需要它们时。
x:DeferLoadStrategy=”Lazy“
如果将此 属性 添加到重复的控件中,它们将仅在需要时加载。因此,在 phone 上,永远不应加载 PC/Tablet 视图,除非用户 运行 在外部显示器上的 Continuum 中。
在 PC 上,您可能仍然会同时加载两者(如果用户调整 window 的大小)- 在 PC 上通常有更多的资源,因此 更少在大多数情况下存在问题。
我研究了将控件移动到不同父级的代码隐藏方法,老实说,我认为这样做还为时过早,因为它甚至可能不会提高性能。
我采用了延迟加载策略 属性,发现性能很好,而且它需要的代码很少。我的重复控件共享同一个 ViewModel,所以我几乎只是添加了 属性 以确保仅在必要时使用资源。
我正在创建一个 Windows 10 通用应用程序,我的主页中有两个面板。
在tablet/desktop模式下,两者同时可见(只是两个简单的Grid
,一个填充左侧,另一个填充右侧)
但是,在 phone 模式下,有一个枢轴,用户可以在面板之间滑动。
(我可以使用 SplitView 和汉堡菜单,它们在 Tablet/Desktop 和 Phone 模式下都很容易工作,但在我的情况下,枢轴更有意义)
所以,我目前所做的是,每个面板都有两个实例。 PhonePanel1
和 PhonePanel2
是我的枢轴控件的两个页面内的两个网格,TabletPanel1
和 TabletPanel2
是两个可以并排显示的网格。我使用 AdaptiveTrigger
s 来检测页面宽度并在这两种查看方法之间切换。
但是,每个面板都有两个实例并不是一个好方法,因为它们显示的内容基本相同。
有没有更好的方法来做到这一点?也许在触发器更改视图模式时更改 Grid 的父项?或者更好的东西?
你的方法没有错。为减少内存使用量,例如在 phone 上发生自适应触发时,将 TabletPanel1 和 TabletPanel2 的可见性设置为折叠。
如果所有面板都使用相同的数据上下文,则保持原样,如果不将折叠控件的数据上下文设置为空。
您可以将每个面板创建为用户控件,然后您只需定义一次内容,但每个控件都可以包含在您想要的每个布局中。
我能想到的更改父级的唯一方法是在后面编写一些代码,将它们呈现在新位置。一个合适的解决方案可能是将控件的加载推迟到需要它们时。
x:DeferLoadStrategy=”Lazy“
如果将此 属性 添加到重复的控件中,它们将仅在需要时加载。因此,在 phone 上,永远不应加载 PC/Tablet 视图,除非用户 运行 在外部显示器上的 Continuum 中。
在 PC 上,您可能仍然会同时加载两者(如果用户调整 window 的大小)- 在 PC 上通常有更多的资源,因此 更少在大多数情况下存在问题。
我研究了将控件移动到不同父级的代码隐藏方法,老实说,我认为这样做还为时过早,因为它甚至可能不会提高性能。
我采用了延迟加载策略 属性,发现性能很好,而且它需要的代码很少。我的重复控件共享同一个 ViewModel,所以我几乎只是添加了 属性 以确保仅在必要时使用资源。