WPF在网格中设置新的控制位置

时间:2015-09-16 09:07:57

标签: wpf grid position controls

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

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

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

Dim p As Point = Mouse.GetPosition(myGrid)

然后使用带有Canvas.SetLeft和Canvas.SetTop的point.x和point.y,但这仅在应用程序全屏并且屏幕res一致时才有效。

我知道要求代码是一种不好的形式,但请在答案中加入一个片段,因为我已经在这个问题上挣扎了一段时间。围成一圈。我正在使用VB,但欢迎任何语言的答案。非常感谢。

2 个答案:

答案 0 :(得分:1)

我认为问题不在于您的代码,而在于您的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>

答案 1 :(得分:1)

Grid基本上将孩子安排在孩子的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);
}

希望有所帮助:)