0

我在后面的代码中创建了 2 个按钮,我试图通过获取按钮坐标来绘制一条连接它们的线,但它不能按照我想要的方式工作,我是新手,我这样做是否正确?

我在互联网上搜索了连接 2 个控件的线路,但我只想要一个使用坐标连接它们的简单控件。

这是我的代码:

 Button btn1 = new Button();
        btn1.Content = "Hello";
        btn1.Width = 150;
        btn1.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
        wrapPanel1.Children.Add(btn1);
        btn1.PreviewMouseDown += new MouseButtonEventHandler(btn1_MouseDown);


        Button btn2 = new Button();
        btn2.Content = "World";
        btn2.Width = 150;
        btn2.HorizontalAlignment = System.Windows.HorizontalAlignment.Right;
        btn2.PreviewMouseDown += new MouseButtonEventHandler(btn1_MouseDown);
        wrapPanel1.Children.Add(btn2);

    private void ShowLocation(ContentControl element)
     {
    var location = element.PointToScreen(new Point(0, 0));
   MessageBox.Show(string.Format(
                                  "{2}'s location is ({0}, {1})", 
                                   location.X, 
                                    location.Y, 
                                   element.Content));

   Line redLine = new Line();
   redLine.X1 = location.X;
   redLine.Y1 = location.Y;
   redLine.X2 = 323;
   redLine.Y2 = 167;


   //Create a red Brush
   SolidColorBrush redBrush = new SolidColorBrush();
   redBrush.Color = Colors.Red;

   //Set Line's width and color
   redLine.StrokeThickness = 4;
   redLine.Stroke = redBrush;

   // Add line to the Grid.
   wrapPanel1.Children.Add(redLine);

     }

  private void btn1_MouseDown(object sender, RoutedEventArgs e)
 {
     var element = sender as ContentControl;
     if (element != null)
     {
         ShowLocation(element);
     }


 }

当您注意到 X2 和 Y2 坐标时,我只是随机给它一个数字,但假设 X1 和 Y1 是从按钮中绘制的,但事实并非如此。

这条线出现在远离按钮的其他地方,但我使用的坐标是按钮的坐标。

另外,我必须从 db 动态创建许多按钮,这只是测试,但我被困在这里。

__编辑____

尝试使用 1 个按钮,我意识到当最大化和最小化时,坐标是不同的,这就是它的样子,每次单击按钮生成线条时,按钮似乎都会增加它的高度。

在此处输入图像描述

我希望线条从侧面按钮宽度的末端开始,如果不可能,那么按钮与线条重叠会很好,但这可能吗?

4

1 回答 1

4

主要问题是 WPF 主要使用基于布局的定位(GridDockPanel等),而不是基于坐标的 Windows 窗体。这意味着,左上角元素的实际位置取决于正在使用的布局控件及其当前设置(是的,如果您对 WPF 非常陌生,这通常会让您大吃一惊)。

如果您想通过 WPF 中的坐标来管理元素的位置,那么您应该使用Canvas(您可以轻松地将此示例从 XAML 转换为 C#):

    <Canvas>
        <Button Canvas.Left="10" Canvas.Top="10" Width="20" Height="20" Content="A"/>
        <Button Canvas.Left="50" Canvas.Top="50" Width="20" Height="20" Content="B"/>
        <Line Canvas.Left="30" Canvas.Top="30" X2="20" Y2="20" StrokeThickness="4" Stroke="Red"/>
    </Canvas>

在此处输入图像描述

于 2013-08-04T09:05:41.953 回答