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);
}
希望对您有所帮助:)
这与其他问题有些重复,因此提前致歉,但我无法理解现有的答案(可能是因为我是 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);
}
希望对您有所帮助:)