【问题标题】:Xamarin.Forms: Oxyplot takes entire pageXamarin.Forms:Oxyplot 占据整个页面
【发布时间】:2017-12-25 23:23:28
【问题描述】:

我已在 Xamarin.Forms 中使用 oxyplot 成功生成了一个绘图,但我无法停止 oxyplot 获取整个页面。

我在轮播中的其他页面上使用 stacklayout,并在每个页面上都有一个横幅作为嵌入式 stacklayout,并且希望该图出现在其下方的嵌入式 stacklayout 中。

但横幅会短暂出现,然后被 oxyplot 覆盖。

我发现应该使用 Grid 而不是 stacklayout,因为存在已知问题,但 grid 也不起作用。

感谢您的任何帮助!这可能是一个绑定问题,例如,如果我删除 Model="{Binding Model}" 它仍然有效!它忽略了 HeightRequest="100" 而只是填充页面。我显然在这里遗漏了一些东西。

这是xaml代码,我已经注释掉了网格尝试,“oxy:PlotView”中的各种选项是我最后一次尝试的:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage 
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="RentGuru2.PieCosts"
xmlns:oxy="clr-namespace:OxyPlot.Xamarin.Forms;assembly=OxyPlot.Xamarin.Forms"
Padding="0, 20, 0, 0"
BackgroundColor="#21b09c">

<StackLayout Orientation="Vertical">
    <StackLayout Orientation="Horizontal" BackgroundColor="#21b09c" HeightRequest="60">
        <Image Source = "BannerLogo.png"  />
        <Label Text="Costs breakdown" FontSize="Large" TextColor="White" Margin="10" VerticalTextAlignment="Center"/>
    </StackLayout>
    <StackLayout HeightRequest="300">
        <oxy:PlotView Model="{Binding Model}" VerticalOptions="Center" HorizontalOptions="FillAndExpand"
                  HeightRequest="100" WidthRequest="100" />
    </StackLayout>
</StackLayout>

<!--<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="5*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="60" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Image Grid.Row="0" Grid.Column ="0" Source = "BannerLogo.png"  />
    <Label Grid.Row="0" Grid.Column ="1" Text="Costs breakdown" FontSize="Large" TextColor="White" Margin="10" VerticalTextAlignment="Center"/>

    <oxy:PlotView Grid.Row="1" Grid.ColumnSpan ="2" Model="{Binding Model}" VerticalOptions="Center" HorizontalOptions="Center" />

</Grid>-->

</ContentPage>

这是相关的oxyplot xaml.cs代码:

    namespace RentGuru2
    {
        [XamlCompilation(XamlCompilationOptions.Compile)]
        public partial class PieCosts : ContentPage
        {
            public PieCosts ()
            {
                InitializeComponent ();
            }

            protected override void OnAppearing()
            {
                Content = new PlotView
                {
                    Model = CreatePieChart()
                };
            }

            private PlotModel CreatePieChart()
            {
                var model = new PlotModel
                {
                    Title = "Costs breakdown",
                    Padding = new OxyThickness(50, 30, 50, 40),
                    TitleFontSize = 22,
                    TitleColor = OxyColors.White
                    //Title = "",
                    //Padding = new OxyThickness(50, 30, 50, 40),
                    //TitleFontSize = 1,
                    //TitleColor = OxyColors.White,

                };

                var ps = new PieSeries
                {
                    StrokeThickness = .25,
                    InsideLabelPosition = .8,
                    AngleSpan = 360,
                    StartAngle = 0,
                    LabelField = "{2:0.0}",
                    FontSize = 15,
                    TextColor = OxyColors.White
                };

【问题讨论】:

  • OnAppearing() 将整个页面的 Content 替换为 PlotView... 所以,你得到了你想要的......:O)

标签: c# xaml xamarin.forms oxyplot


【解决方案1】:

就像我们在 cmets 部分中提到的,整个页面的 Content 正在被 PlotView 替换。此外,您的绑定已损坏。所以,这里有一些关于如何做到这一点的示例代码:

XAML:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:App39"
             xmlns:oxy="clr-namespace:OxyPlot.Xamarin.Forms;assembly=OxyPlot.Xamarin.Forms"
             x:Class="App39.MainPage">

    <ContentPage.Content>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="5*"/>
                <RowDefinition Height="5*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="2*"/>
                <ColumnDefinition Width="4*"/>
            </Grid.ColumnDefinitions>

            <Label Grid.Row="0" 
                   Grid.ColumnSpan="2"
                   Text="My Sample App" 
                   FontAttributes="Bold"
                   FontSize="Large"
                   VerticalOptions="Center" 
                   HorizontalOptions="Center" />
            <oxy:PlotView 
                Grid.Row="1" 
                Grid.Column="1"
                Model="{Binding Model}"/>
            <Image Grid.Row="2" 
                   Grid.Column="0"
                   Source="pic111.jpg" 
                   Aspect="Fill" />
            <BoxView Grid.Row="1" 
                     Grid.Column="0" 
                     HorizontalOptions="Fill" 
                     VerticalOptions="Fill" 
                     Color="LightBlue"/>
            <BoxView Grid.Row="2" 
                     Grid.Column="1" 
                     HorizontalOptions="Fill" 
                     VerticalOptions="Fill" 
                     Color="LightSeaGreen"/>
        </Grid>
    </ContentPage.Content>

CS:

public partial class MainPage : ContentPage
{
    SampleViewModel vm;

    public MainPage()
    {
        InitializeComponent();

        vm = new SampleViewModel();
        BindingContext = vm;
    }
}

查看模型:

public class SampleViewModel
{
    public PlotModel Model { get; set; }

    public SampleViewModel()
    {
        Model = GetModel();
    }

    private PlotModel GetModel()
    {
        var plotModel1 = new PlotModel();
        plotModel1.Title = "Sample Pie Chart";
        plotModel1.Background = OxyColors.LightGray;

        var pieSeries1 = new PieSeries();
        pieSeries1.StartAngle = 90;
        pieSeries1.FontSize = 18;
        pieSeries1.FontWeight = FontWeights.Bold;
        pieSeries1.TextColor = OxyColors.LightGray;
        pieSeries1.Slices.Add(new PieSlice("A", 12));
        pieSeries1.Slices.Add(new PieSlice("B", 14));
        pieSeries1.Slices.Add(new PieSlice("C", 16));

        plotModel1.Series.Add(pieSeries1);

        return plotModel1;
    }
}

【讨论】:

  • 太棒了!由于您的努力,现在可以按要求工作。我也对 Xamarin 的工作原理有了更好的了解,再次感谢。
  • 非常感谢您提供此解决方案。它工作得很好,让你想知道为什么官方文档没有提供这样的信息。
  • @jsanalytics 我遇到了同样的问题,但我没有使用 xamarin.forms,而是使用 Mvvmcross 和 Xamarin.Android。这是我的问题:stackoverflow.com/q/53731505/6276898
【解决方案2】:

我也遇到过这个问题,jsanalytics 的解决方案是正确的。我注意到使用BindingContext = this; 并在页面中创建Model 属性不起作用! Model 属性需要是单独的 Viewmodel 类中的属性.

此代码不起作用:

XAML:

<StackLayout>
    <Button Text="Update" x:Name="cmdUpdate" Clicked="cmdUpdate_Clicked" />
    <oxy:PlotView Model="{Binding Model}" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"/>
</StackLayout>

CS:

public partial class MainPage : ContentPage
{
    public PlotModel Model = ExampleGenerator.LineSeries();

    public MainPage()
    {
        InitializeComponent();

        BindingContext = this;
    }
}

【讨论】:

  • BindingContext = this; 也可以工作...在上面的代码示例中,PlotModel Model 声明缺少 getset 访问器,这使其成为 Field 而不是属性,因此绑定不起作用。
  • 顺便说一句,如果您在 VS 中检查 Output 窗口,您应该会看到类似 "property not found" 绑定表达式错误。
猜你喜欢
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多