从XAML访问值和代码隐藏文件

时间:2016-09-15 16:39:08

标签: c# xaml xamarin static xamarin.forms

我正在尝试访问一个值,该值应该在XAML和代码隐藏文件之间共享。因此我认为我可以使用x:static markup extension。这是我的代码:

DetailPage.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:AppName.Pages.DetailPage;assembly=AppName"
             x:Class="AppName.Pages.DetailPage">

  <Grid x:Name="masterGrid">
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="{x:Static local:DetailPage.Width}" />
      <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <!-- ... -->
  </Grid>
</ContenPage>

DetailPage.xaml.cs

namespace AppName.Pages
{
    public partial class DetailPage : ContentPage
    {
        public static readonly double Width = 40;
        // ...
    }
}

如果我启动应用程序,我会

  

System.Reflection.TargetInvocationException:调用目标抛出了异常。

如果我删除x:static标记扩展名,那么页面工作正常。我试过不同的命名空间,但我没有成功。

解决方案:

Karel Tamayo的帮助下,我得到了它的工作:

DetailPage.xaml

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:AppName.Pages;assembly=AppName"
             x:Class="AppName.Pages.DetailPage">

  <Grid x:Name="masterGrid">
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="{x:Static local:DetailPage.Width}" />
      <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <!-- ... -->
  </Grid>
</ContenPage>

DetailPage.xaml.cs

namespace AppName.Pages
{
    public partial class DetailPage : ContentPage
    {
        public static readonly GridLength Width = new GridLength(40, GridUnitType.Absolute);
        // ...
    }
}

正如人们可以从命名空间中看到的那样,DetailPage位于Pages文件夹中。

1 个答案:

答案 0 :(得分:3)

当您指定GridLength值时,Width属性需要一个double类型的对象。

在DetailPage.xaml.cs中尝试此操作:

public static readonly GridLength Width = new GridLength(40, GridUnitType.Pixel);

再次测试您的应用。 您可以根据需要将设备配置为GridUnitType.PixelGridUnitType.StarGridUnitType.Auto