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

标签 c# wpf adorner

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

我是 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/

相关文章:

c# - 使用装饰器复制 UI 元素

c# - 我可以使用 Moq 的 SetupSequence 抛出异常然后返回 void 吗?

c# - 无法从 2 个客户端应用程序访问同一个 SQL Server 数据库

c# - ListView.ItemContainerStyle IsSelected 属性似乎不影响 WinRT 上的选择

wpf - xamDataGrid-缩进嵌套级别

wpf - 如何更改DocumentViewer的查看模式

c# - 使用 DataGridViewCheckBoxColumn 更新 DatagridView

WPF将Adorner移动到AdornerLayer或Window之外

c# - 如何在 IIS 应用程序池崩溃、启动或停止时收到通知

c# - 可调整大小的控制用户的 WPF Adorner