WPF 在网格内设置新的控件相对位置

WPF set new control position relative within a grid

这与其他问题有些重复,因此提前致歉,但我无法理解现有的答案(可能是因为我是 WPF 新手)。

我在 canvas 内有一个网格。网格以编程方式添加,而不是 xaml 并且比 canvas 小得多。我想以编程方式在用户单击网格的位置添加一个控件(文本框)。该应用程序可能会或可能不会全屏,用户的屏幕分辨率可能会有所不同。

目前我正在使用鼠标按下事件并获得一个分数:

Dim p As Point = Mouse.GetPosition(myGrid)

然后将 point.x 和 point.y 与 Canvas.SetLeft 和 Canvas.SetTop 一起使用,但这仅在应用全屏且屏幕分辨率一致时有效。

我知道要求代码是一种不好的形式,但请在您的回答中包含一个片段,因为我已经为此苦苦思索了一段时间并且一直在兜圈子。我正在使用 VB,但欢迎使用任何语言回答。非常感谢。

我认为问题不在于您的代码,而在于您的 xaml。

Mouse.GetPosition(myGrid)

应该很好用。

我认为您的网格大小与 Canvas 不一样。 尝试这样的事情:

  <DockPanel>
    <Canvas x:Name="can">
      <Grid Height="{Binding ElementName=can, Path=ActualHeight}" Width="{Binding ElementName=can, Path=ActualWidth}" Background="Red" PreviewMouseDown="Grid_PreviewMouseDown" />
    </Canvas>
  </DockPanel>

Grid安排其children基本上大部分在child的Margin属性上。 所以这样做 OnClick 你的网格:

// dont forget to add an event handler on creating the grid
Grid myGrid = new Grid();
myGrid.MouseDown += myGrid_MouseDown;

private void myGrid_MouseDown(object sender, MouserEventArgs e)
{
    Point p = e.GetPosition(myGrid);        

    TextBox tb = new TextBox();
    tb.Margin = new Thickness(p.X, p.Y, 0, 0);
    tb.HorizontalAlignment = HorizontalAlignment.Left;
    tb.VerticalAlignment = VerticalAlignment.Top; // cuz we set margin on Top and Left sides..

    myGrid.Children.Add(tb);
}

希望对您有所帮助:)