WPF中的多个布局

本文关键字:布局 WPF | 更新日期: 2023-09-27 18:20:17

WPF窗口是否可以有多个布局?

也就是说,我有一个应用程序,可以在平板电脑上运行,也可以在更传统的台式机或笔记本电脑上运行。桌子的屏幕分辨率可能比笔记本电脑或台式机高得多,但由于物理屏幕尺寸较小,在平板电脑上以不同的方式布置控件可能会更好。

如果这是可能的,你怎么做?

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;
    }
}