WPF中的多个布局

时间:2014-09-02 13:45:32

标签: c# wpf layout

是否可以为WPF窗口设置多个布局?

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

如果可以,你怎么做?

1 个答案:

答案 0 :(得分:0)

有许多不同的方式,每种方式可能会根据您的需要提供不同的优势。

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

  • 将平台纳入其输出的值转换器

  • 在代码中加载了多个XAML

  • 在不同平台内重复使用控件的完全不同的平台页面

  • 实现相当于Xamarin的OnIdiom,这可能是最好的方法。我用OnIdiomExtension补充了我自己的实现:IMarkupExtension所以我可以在属性中使用它而不必将它们作为单独的元素分解

我确信这个列表可以继续,在WPF中总有10种方法可以做同样的事情 - 9个错误,1个正确和1个未记录的通常最好:)


编辑:OnIdiom详细信息

基本上OnIdiom是一个通用构造,它选择3个元素之一 - 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和桌面属性以简化

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