使用UltraControlContainerEditor嵌入任何控件不适用于Image列

时间:2015-06-24 13:06:06

标签: c# winforms infragistics

我想在UltraGridCell中以另一种缩放模式显示图片。模式应将图像缩放到单元格高度,并从右侧剪切图像的其余部分以适合单元格。如果我可以自己绘制它很容易,因为EmbeddableImageRenderer不允许我设置它的缩放行为(我不是在谈论MaintainAspectRatio,因为我仍然想保持宽高比)。

我用tutorial to embed any control in a cell尝试了。并且它与TrackBar的给定示例一起工作正常(在我的微小测试项目中也使用ProgressBar作为RendererControl)。但它似乎不适用于显示图像的列。

作为一个DataSource,我有一个我自己的类列表,其中一个Image属性显示在网格中。作为Editor- / RendererControl,我设置了两个常规PictureBox。

有什么建议可以解决缩放图像或将任何控件设置到图片列的主要问题(然后处理缩放)?

1 个答案:

答案 0 :(得分:0)

我看不出为什么UltraControlContainerEditor不能与图像列一起使用,只要您使用的控件具有一个带有Image的属性并且您在编辑器上指定了正确的PropertyName。但无论如何,这可能不是最有效的方法。

更好的方法是使用DrawFilter自己绘制图像。

public class ImageScalingDrawFilter : IUIElementDrawFilter
{
    bool IUIElementDrawFilter.DrawElement(DrawPhase drawPhase, ref UIElementDrawParams drawParams)
    {
        switch (drawPhase)
        {
            case DrawPhase.BeforeDrawImage:

                ImageUIElement imageElement = (ImageUIElement)drawParams.Element;
                Image image = imageElement.Image;                    

                int availableHeight = drawParams.Element.RectInsideBorders.Height;
                float ratio = (float)availableHeight / (float)image.Height;

                float newHeight = image.Height * ratio;
                float newWidth = image.Width * ratio;

                Rectangle rect = new Rectangle(
                    imageElement.Rect.X,
                    imageElement.Rect.Y,
                    (int)(newWidth),
                    (int)(newHeight)

                    );

                // Draw the scaled image.
                drawParams.Graphics.DrawImage(image, rect);

                // This tells the grid not to draw the image (since we've already drawn it). 
                return true;
        }

        return false;
    }

    DrawPhase IUIElementDrawFilter.GetPhasesToFilter(ref UIElementDrawParams drawParams)
    {
        UIElement element = drawParams.Element;
        // Look for an ImageUIElement
        if (element is ImageUIElement)
        {
            // Presumably, we only want to this images in cells
            // and not every image in the entire grid, so make sure it's in a cell.
            CellUIElement cellElement = element.GetAncestor(typeof(CellUIElement)) as CellUIElement;
            if (null != cellElement)
            {
                // We could also limit this to a particular column or columns.
                switch (cellElement.Cell.Column.Key)
                {
                    case "Image":
                        return DrawPhase.BeforeDrawImage;
                }
            }
        }

        return DrawPhase.None;
    }
}

您将DrawFilter分配给网格,如下所示:

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ultraGrid1.DrawFilter = new ImageScalingDrawFilter();
    }