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));

次に、これらの 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>

または、さらに単純に、Horizo​​ntalAlignment、VerticalAlignment、および Margin プロパティを取る別のグリッド内の Image と Line:

<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));

また、Line コントロールHorizontalAlignment.Leftをオンに設定する必要があります。VerticalAlignment.Top

于 2012-12-09T18:05:19.367 に答える