Вы должны получить точку экрана относительно CartesianChart
, иначе возвращаемая позиция будет относительно MainWindow
(потому что вы передали this
).
Прочтите this , чтобы получить немного больше подробное объяснение.
Я также упростил ваш код:
public ObservablePoint MovingPoint { get; set; }
private void ChartOnDataClick(object sender, ChartPoint p) //click on point
{
var observablePointIndex = this.diagram.Series[0].Values
.GetPoints(this.diagram.Series[0].Model.View)
.ToList()
.IndexOf(p);
this.MovingPoint = this.diagram.Series[0].Values[observablePointIndex] as ObservablePoint;
}
private void ChartOnMouseMove(object sender, MouseEventArgs e)
{
if (this.MovingPoint == null
|| e.LeftButton != MouseButtonState.Pressed)
return;
Point newPoint = this.diagram.ConvertToChartValues(e.GetPosition(this.diagram));
this.MovingPoint.X = newPoint.X;
this.MovingPoint.Y = newPoint.Y;
}
private void ChartOnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
this.MovingPoint = null; // deactivate point moving
}
Пример Grid
Обратите внимание, что высота строки / столбца / width of *
заставит строку / столбец растягиваться, чтобы занять максимальное пространство, когда родительский элемент, например, Window
, растет. *
- значение по умолчанию. Размер Auto
заставляет строку / столбец корректировать свой размер в соответствии с содержимым.
При использовании строк / столбцов можно позволить элементу управления растягиваться на несколько строк / столбцов, указав Grid.RowSpan
/ Grid.ColumnSpan
.
Чтобы диаграмма увеличивалась, высота строки, содержащей диаграмму, устанавливается на *
. Для всех остальных строк установлено значение Auto
.
Чтобы диаграмма могла растягиваться на все Grid
, для Grid.ColumnSpan
установлено значение 3 (поскольку Grid
содержит три столбца).
Следующий пример основан на размещенном вами изображении:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<StackPanel Grid.Row="0" Grid.Column="0"
Orientation="Horizontal"
Margin="0,0,12,0">
<StackPanel>
<TextBlock Text="ComboBox1 Label" />
<ComboBox />
</StackPanel>
<StackPanel>
<TextBlock Text="ComboBox2 Label" />
<ComboBox />
</StackPanel>
</StackPanel>
<StackPanel Grid.Row="0" Grid.Column="1"
Orientation="Horizontal"
VerticalAlignment="Bottom"
Margin="0,0,12,0">
<RadioButton Content="Text" />
<RadioButton Content="Text" />
<RadioButton Content="Text" />
</StackPanel>
<StackPanel Grid.Row="1" Grid.Column="2"
HorizontalAlignment="Left">
<TextBlock Text="Button Label" />
<Button Content="Text" />
</StackPanel>
<CartesianChart Grid.Row="2"
Grid.Column="0"
Grid.ColumnSpan="3" />
<StackPanel Grid.Row="3" Grid.Column="0">
<TextBlock Text="Button Label" />
<Button Content="Text" />
</StackPanel>
</Grid>