0

我在 WPF 中的网格上设置了一个图像控件:

<Window x:Class="Window.PhotoViewer"
    Title="PhotoViewer" Height="768" Width="1024" BorderThickness="0,0,0,0">


<Grid Name="ViewerGrid">
    <Image Name="imageBox" Width="980" Height="615" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,50,0,0" Stretch="None" />
</Grid>

我使用函数TransformToAncestor来获取 imageBox 的位置:

  Point leftTop = imageBox.TransformToAncestor(this).Transform(new Point(-imageBox.ActualWidth/2, -imageBox.ActualHeight/2));
  Point rightButtom = imageBox.TransformToAncestor(this).Transform(new Point(imageBox.ActualWidth/2, imageBox.ActualHeight/2));

然后我画一条线来连接这两点:

Line line = new Line();
line.Stroke = System.Windows.Media.Brushes.OrangeRed;
line.X1 = leftTop.X;
line.Y1 = leftTop.Y;
line.X2 = rightButtom.X;
line.Y2 = rightButtom.Y;
line.HorizontalAlignment = HorizontalAlignment.Center;
line.VerticalAlignment = VerticalAlignment.Center;
line.StrokeThickness = 5;
ViewerGrid.Children.Add(line);

结果是错误的。当对齐为中心时如何获得控制器的正确位置?

4

1 回答 1

0

不太确定您要做什么,但我想以下 XAML 应该可以在没有任何 TransformToAncestor 调用的情况下完成这项工作:

<Grid Name="ViewerGrid">
    <Image Name="imageBox" Width="980" Height="615" Stretch="None"
           VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,50,0,0" />

    <Line HorizontalAlignment="{Binding HorizontalAlignment, ElementName=imageBox}"
          VerticalAlignment="{Binding VerticalAlignment, ElementName=imageBox}"
          Margin="{Binding Margin, ElementName=imageBox}"
          X2="{Binding ActualWidth, ElementName=imageBox}"
          Y2="{Binding ActualHeight, ElementName=imageBox}"
          Stroke="OrangeRed" StrokeThickness="5"/>
</Grid>

或者,更简单的是,另一个 Grid 中的 Image 和 Line 采用 Horizo​​ntalAlignment、VerticalAlignment 和 Margin 属性:

<Grid Name="ViewerGrid">
    <Grid HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,50,0,0">
        <Image Name="imageBox" Width="980" Height="615" Stretch="None"/>
        <Line X2="{Binding ActualWidth, ElementName=imageBox}"
              Y2="{Binding ActualHeight, ElementName=imageBox}"
              Stroke="OrangeRed" StrokeThickness="5"/>
    </Grid>
</Grid>

如果由于某种原因您需要使用 TransformToAncenstor,我想您将不得不像这样获得图像框:

var transform = imageBox.TransformToAncestor(this);
Point topLeft = transform.Transform(new Point());
Point bottomRight = transform.Transform(new Point(imageBox.ActualWidth, imageBox.ActualHeight));

HorizontalAlignment.Left而且您必须VerticalAlignment.Top在 Line 控件上进行设置。

于 2012-12-09T18:05:19.367 回答