Я строю диаграмму пользовательского интерфейса Xamarin.Forms, используя OxyPlot.
Я хочу добиться следующего: после того, как я отобразлю область графика с двумя нарисованными точками, отобразим слева и справа от графика метку, указывающую значение для каждой точки.
Логика c, которую я придумал, чтобы добиться того, чего я хочу, это: Создать два абсолютных макета слева и справа от графика. Поместите метки в AbsoluteLayout.LayoutBounds (10, 0, 40, 40). Зная, что высота графика (YAxis) равна 211 pt, определите верхнее значение y (последний тик в верхней части YAxis) и нижнее значение y (последний тик в нижней части YAxis). После того, как эти два значения извлечены из графика в виде DataPoint, теперь, используя точку данных, нарисованную на графике, я могу определить, где на экране существует эта точка, чтобы затем я мог переместить метку с тем же уровнем точек (два данных точки = две боковые метки). Например:
Первая точка данных = 70
- Вторая точка данных = 40
Теперь на оси YA, если верхняя Точка Y равна 120, а нижняя точка Y равна 30 =>
Положение метки первой точки определяется следующим образом:
расстояние по оси Y: DistYAxis = 120 - 30 = 90
расстояние до 1-й точки данных: DistPointOne = 70 - 30 = 40
DistYAxis => 211 пт (высота экрана графика)
DistPointOne =>? (высота экрана под точкой данных 70).
=> DataPointOne_Height = DistPointOne * 211 / DistYAxis = 94
Теперь просто установите текст метки равным 70 (например, 70 кг), а затем измените его положение на AbsoluteLayout.LayoutBounds (10, 211 - (margin + DataPointOne_Height), 40, 40): 211 - высота абсолютного макета, содержащего метку (каждая метка внутри абсолютного макета), поле составляет около 20 от вершины синей зоны до уровня вершины оси YAXIS. .
Вопросы:
- Если вы считаете эту логику c оптимальной Тогда как определить верхнюю и нижнюю точки Y оксиплота? В настоящее время я не нашел способа получить эту информацию из сюжета.
- Если у вас есть лучшее решение, я был бы рад узнать его.
Это Xaml код пользовательского интерфейса на снимке экрана:
<Grid AbsoluteLayout.LayoutBounds="0,50,1,.7"
AbsoluteLayout.LayoutFlags="WidthProportional,HeightProportional"
Margin="60,10,60,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="80"/>
</Grid.ColumnDefinitions>
<AbsoluteLayout Grid.Column="0"
BackgroundColor="Blue">
<Label x:Name="StartWeightLabel"
Text="83 kg"
AbsoluteLayout.LayoutBounds="3,20,1,30"
AbsoluteLayout.LayoutFlags="WidthProportional"
HorizontalOptions="CenterAndExpand"/>
</AbsoluteLayout>
<!-- Chart -->
<AbsoluteLayout x:Name="weightChart"
Grid.Column="1"/>
<AbsoluteLayout Grid.Column="2"
BackgroundColor="Blue">
<Label x:Name="TargetWeightLabel"
Text="77 kg"
HorizontalOptions="CenterAndExpand"/>
</AbsoluteLayout>
</Grid>
Здесь я рисую точки данных и должен располагать метки:
async Task DrawGraph()
{
weightStartTargetGraph.Points.Clear();
// Draw the weight data points
weightStartTargetGraph.Points.Add(new DataPoint(DateTimeAxis.ToDouble(startDate), weightProgramConfig.StartWeight));
weightStartTargetGraph.Points.Add(new DataPoint(DateTimeAxis.ToDouble(targetDate), weightProgramConfig.TargetWeight));
// Reposition the weight indicators: Here I should implement
// the logic mentioned above
}