WPF中的多个布局
本文关键字:布局 WPF | 更新日期: 2023-09-27 18:20:17
WPF窗口是否可以有多个布局?
也就是说,我有一个应用程序,可以在平板电脑上运行,也可以在更传统的台式机或笔记本电脑上运行。桌子的屏幕分辨率可能比笔记本电脑或台式机高得多,但由于物理屏幕尺寸较小,在平板电脑上以不同的方式布置控件可能会更好。
如果这是可能的,你怎么做?
有很多不同的方法,根据您的需要,每种方法都可能具有不同的优势。
-
附加的属性具有不同的默认值,有条件编译,具有查找该属性的项目样式/模板
-
将平台的输出考虑在内的值转换器
-
在代码中加载多个XAML
-
完全不同的平台页面,跨平台重复使用内部的控件
-
实现Xamarin的OnIdiom,这可能是最好的方法。我用OnIdiomExtension:IMarkupExtension补充了我自己的实现,这样我就可以在属性中使用它,而不必将它们分解为单独的元素
我相信这个列表可以继续下去,在WPF中总是有10种方法可以做同样的事情——9种错误,1种正确,1种未记录,这通常是最好的:)
编辑:OnIdiom详细信息
本质上讲,OnIdiom是一个泛型构造,它从三个元素中选择一个——OnTablet、OnPhone和OnDesktop——每个元素都是泛型类型。你也可以选择不使用非通用版本,只使用UIElement作为元素
下面是几个如何在XAML 中使用的例子
<RowDefinition.Height>
<OnIdiom x:TypeArguments="GridLength" Phone="1.25*" Tablet="1.35*" />
</RowDefinition.Height>
<OnIdiom x:TypeArguments="View">
<OnIdiom.Phone>
<local:BuildingAreasView/>
</OnIdiom.Phone>
<OnIdiom.Tablet>
<Grid x:Name="gridRoot">....</Grid>
</OnIdiom.Tablet>
</OnIdiom>
以及XAML中使用的标记扩展:
以下是OnIdiomExtension.cs中的一些示例代码,为了简洁起见,显然缺少Tablet和Desktop属性
[ContentProperty ("Default")]
public class OnIdiomExtension : IMarkupExtension
{
public object Default { get; set; }
public object Phone { get; set; }
public object ProvideValue (IServiceProvider serviceProvider)
{
object val = Default;
switch (Device.Idiom) {
case TargetIdiom.Phone:
val = Phone ?? Default;
break;
}
return val;
}
}