2015-06-24 1 views
0

Я хочу отобразить изображение в другом режиме масштабирования в UltraGridCell. Режим должен масштабировать изображение до высоты ячейки и закрепить остальную часть изображения справа, чтобы вписаться в ячейку. Это легко, если я могу просто рисовать его сам, поскольку EmbeddableImageRenderer не позволяет мне устанавливать его масштабирующее поведение (я не говорю о MaintainAspectRatio, поскольку я все еще хочу поддерживать соотношение сторон).Вставить любой элемент управления с UltraControlContainerEditor не работает для столбца изображения

Я попробовал его с помощью tutorial to embed any control in a cell. И он отлично работает с данным примером TrackBar (и в моем крошечном тестовом проекте также с ProgressBar как RendererControl). Но, похоже, он не работает с столбцами, отображающими изображения.

Как источник данных У меня есть список моего собственного класса с свойством Image, которое отображается в сетке. В качестве редактора/RendererControl я установил два обычных PictureBoxes.

Любые предложения по решению основной проблемы масштабирования изображения или установки какого-либо элемента управления в столбец изображения (который будет иметь дело с масштабированием)?

ответ

0

Я не вижу причин, по которым UltraControlContainerEditor не должен работать со столбцом изображения, при условии, что элемент управления, который вы используете, имеет свойство, которое принимает изображение, и что вы указываете правильное имя свойства в редакторе. Во всяком случае, это, вероятно, не самый эффективный подход.

Лучшим подходом было бы использовать 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(); 
    } 
+0

Хотя ваш ответ довольно поздно для синхронизации проблемы я до сих пор благодарен за это, и я постараюсь это, как только я может, потому что ваш код выглядит многообещающим. Думаю, я коснусь этого кода через 2 месяца. Я буду комментировать снова, чтобы кто-нибудь знал, является ли это хорошей альтернативой. – JoshuaBehrens