C# WPF中的多布局

C# WPF中的多布局,c#,wpf,layout,C#,Wpf,Layout,一个WPF窗口可以有多个布局吗 也就是说,假设我有一个可以在平板电脑或更传统的台式机或笔记本电脑上运行的应用程序。桌面的屏幕分辨率可能比笔记本电脑或台式机高得多,但由于物理屏幕尺寸较小,因此最好在平板电脑上以不同的方式布置控件 如果这是可能的,你怎么做?有许多不同的方法,根据你的需要,每种方法都可能有不同的优势 附加属性,该属性具有不同的默认值,经过条件编译,并具有查找该属性的项目样式/模板 将平台的输出考虑在内的值转换器 代码中加载了多个XAML 完全不同的平台页面,跨平台重用内部控件 实现

一个WPF窗口可以有多个布局吗

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


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

有许多不同的方法,根据你的需要,每种方法都可能有不同的优势

  • 附加属性,该属性具有不同的默认值,经过条件编译,并具有查找该属性的项目样式/模板

  • 将平台的输出考虑在内的值转换器

  • 代码中加载了多个XAML

  • 完全不同的平台页面,跨平台重用内部控件

  • 实现Xamarin的等效方法,这可能是最好的方法。我用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>

我以前从未见过Xamarin的东西,因为我不做iOS编程。你有它的使用实例的链接吗?该文档并没有解释它是如何使用的。参见更新,您应该能够实现OnIdiomOK背后的代码,我知道它是如何工作的,尽管我有一个问题。在您给出的
IMarkUpExtension
实现中,“Device”对象从何而来?哦,那就是Xamarin,您可以通过条件编译实现同样的功能,或者创建自己的设备类来检测环境运行时
[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;
    }
}