这有点与其他问题重复,所以提前道歉,但我无法理解现有的答案(可能是因为我是WPF新手)。
我在画布中有一个网格。网格是以编程方式添加的,而不是在xaml中添加,并且比画布小得多。我想以编程方式在用户单击网格的位置添加一个控件(文本框)。应用程序可能全屏也可能不是全屏,用户屏幕分辨率可能不同。
目前我正在使用鼠标按下事件并获得一个观点:
Dim p As Point = Mouse.GetPosition(myGrid)
然后使用带有Canvas.SetLeft和Canvas.SetTop的point.x和point.y,但这仅在应用程序全屏并且屏幕res一致时才有效。
我知道要求代码是一种不好的形式,但请在答案中加入一个片段,因为我已经在这个问题上挣扎了一段时间。围成一圈。我正在使用VB,但欢迎任何语言的答案。非常感谢。
答案 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);
}
希望有所帮助:)