gpt4 book ai didi

c# - 当窗口大小更改时,如何在装饰器上绘制一个矩形以随其绑定(bind)到的图像元素缩放?

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:24 25 4
gpt4 key购买 nike

我正在使用装饰器上绘制的矩形来标记图像上的感兴趣区域。问题是,如果我调整窗口大小,矩形不会改变大小。

我是 WPF 的新手,所以我做了很多研究,用谷歌搜索了我能用多个不同的搜索词。实际上,我只是通过这种方式学习了装饰器,而且我已经做到了这一点,但我在如何完成最后一 block 的问题上遇到了瓶颈。我知道我的问题是基于矩形的大小,但我不知道要捕获/寻找什么来调整它,因为 wpf 在窗口调整大小时调整实际图像对象的大小,所以没有比例因子可看。

这是我正在其中进行测试的应用程序的 XAML。

<Window x:Class="TestingAdorners.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestingAdorners"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid ClipToBounds="True">
<AdornerDecorator>
<Image Name="Btn" Source="nyan.png" Stretch="Uniform"/>
</AdornerDecorator>
</Grid>
</Window>

装饰类:

    class RoiAdorner : Adorner
{
public Rect rectangle = new Rect();
public RoiAdorner(UIElement adornedElement) : base(adornedElement)
{
rectangle.Height = 30;
rectangle.Width = 100;
IsHitTestVisible = false;

}

protected override void OnRender(DrawingContext drawingContext)
{
Pen pen = new Pen(Brushes.Green, 5);

drawingContext.DrawRectangle(null, pen, rectangle);

}
}

和 Xaml.cs

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
AdornerLayer.GetAdornerLayer(Btn).Add(new RoiAdorner(Btn));

}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
}
}

期望的结果是矩形随图像对象缩放,以便它始终覆盖图像的相同区域。问题是我不知道如何捕获比例因子以在窗口调整大小时将其放大和缩小。

更新:在思考了 Frenchy 的建议后,我意识到答案很简单:“标准化你的坐标”

最佳答案

你只需像这样调整你的渲染方法:

class RoiAdorner : Adorner
{
public double factorX = 0d;
public double factorY = 0d;
public Rect rectangle = new Rect();
public RoiAdorner(UIElement adornedElement) : base(adornedElement)
{

rectangle.Height = 30;
rectangle.Width = 100;
IsHitTestVisible = false;

}

protected override void OnRender(DrawingContext drawingContext)
{
if (factorY == 0)
factorY = rectangle.Height / AdornedElement.DesiredSize.Height;
if (factorX == 0)
factorX = rectangle.Width / AdornedElement.DesiredSize.Width;
var r = new Rect(new Size(AdornedElement.DesiredSize.Width * factorX, AdornedElement.DesiredSize.Height * factorY));
//Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);
drawingContext.DrawRectangle(null, new Pen(Brushes.Red, 5), r);

}

this.AdornedElement.DesiredSize 为您提供图像的大小。

关于c# - 当窗口大小更改时,如何在装饰器上绘制一个矩形以随其绑定(bind)到的图像元素缩放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58014445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com