2017-12-28 12 views
1

Ich habe ein Datagrid, das Thumbnails einiger Bilddateien zusammen mit anderen Daten zeigt. Ich verwende einen Konverter, um einen Teil eines Bildes zu beschneiden und das zugeschnittene Bild dann im Datagrid anzuzeigen. Hier ist der Screenshot des Rasters: enter image description here Das Bild zeigt gut, aber es ist sehr klein.Wenn ich die Breite der Spalten mit der Maus ändern, dann gibt es Änderungen in der Bildbreite. Aber das Bild ist voller Raum im cell.Below nicht nehmen ist der Code, den ich verwende:Bild, das den gesamten Platz im DataGridCell nicht einnimmt

<DataGrid Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="1" RowHeight="30" x:Name="dgFileDetails" CanUserAddRows="False" AutoGenerateColumns="False" SelectionMode="Single" CellEditEnding="dgFileDetails_CellEditEnding" SelectionChanged="dgFileDetails_SelectionChanged" MouseDoubleClick="dgFileDetails_MouseDoubleClick" AlternatingRowBackground="{StaticResource LightGrayColorBrush}" GridLinesVisibility="None" CurrentCellChanged="dgFileDetails_CurrentCellChanged" > 
    <DataGrid.Resources> 
     <Style TargetType="{x:Type DataGridCell}" x:Key="TextCellStyle"> 
      <Setter Property="VerticalAlignment" Value="Center" /> 
     </Style> 
     <Style TargetType="{x:Type DataGridCell}" x:Key="ImageCellStyle"> 
      <Setter Property="VerticalAlignment" Value="Stretch"></Setter> 
      <Setter Property="HorizontalAlignment" Value="Stretch"></Setter> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> 
      <Setter Property="VerticalContentAlignment" Value="Stretch"></Setter> 
     </Style> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridTextColumn IsReadOnly="False" Width="2*" Header="Sheet Name" Binding="{Binding NewFileName}" /> 
     <DataGridTextColumn IsReadOnly="False" Width="1*" Header="Label" Binding="{Binding FileId}" /> 
     <DataGridTextColumn IsReadOnly="False" Width="1*" Header="Trade" Binding="{Binding Trade}" /> 
     <DataGridTextColumn IsReadOnly="False" Width="1*" Header="Sub-Trade" Binding="{Binding SubTrade}" /> 
     <DataGridTextColumn IsReadOnly="False" Width="1*" Header="Version" Binding="{Binding VersionName}" /> 
     <DataGridTextColumn IsReadOnly="False" Width="0.5*" Header="Revision" Binding="{Binding RevisionNo}" /> 
     <DataGridTemplateColumn Header="Sheet Title" Width="1*" IsReadOnly="True" CellStyle="{StaticResource ImageCellStyle}"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Image Source="{Binding TitleImage,Converter={StaticResource ConverterTupleToImage}}" Stretch="Fill" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTemplateColumn Header="Sheet Label" Width="1*" IsReadOnly="True" CellStyle="{StaticResource ImageCellStyle}"> 
      <DataGridTemplateColumn.CellTemplate > 
       <DataTemplate> 
        <Image Source="{Binding IdImage,Converter={StaticResource ConverterTupleToImage}}" Stretch="Fill" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Es ist ersichtlich, dass ich alle Ausrichtungseigenschaften der Zelle festgelegt haben zu strecken, aber es funktioniert nicht help.So, wie mache ich das Image-Element, um den gesamten Raum der DataGridCell zu nehmen.

Edit: Hier ist der Code für den Konverter:

public object Convert(object value,Type targetType,object parameter,CultureInfo cultureInfo) 
{ 
    try 
    { 
     if (value is Tuple<Tuple<int, int, int, int>, string>) 
     { 
      Tuple<Tuple<int, int, int, int>, string> tuple = value as Tuple<Tuple<int, int, int, int>, string>; 
      Tuple<int, int, int, int> rectDims = tuple.Item1; 
      string filePath = tuple.Item2; 
      using (MyDocument doc = MyDocument.Load(filePath)) 
      { 
       var size = doc.Size; 
       int width = (int)(size.Width); 
       int height = (int)(size.Height); 
       Rectangle cropSection = new Rectangle(rectDims.Item1, rectDims.Item3, Math.Abs(rectDims.Item1 - rectDims.Item2), Math.Abs(rectDims.Item3 - rectDims.Item4)); 
       using (Image image = doc.Render(0, width, height, 300, 300, false)) 
       { 
        Bitmap targetRect = new Bitmap(cropSection.Width, cropSection.Height); 
        using (Graphics g = Graphics.FromImage(targetRect)) 
        { 
         g.DrawImage(image, 0, 0, cropSection, GraphicsUnit.Pixel); 
        } 
        return BitmapConverter.ToImageSource(targetRect); 
       } 
      } 
     } 
     else 
     { 
      return null; 
     } 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 
+0

Wie sieht der Konverter aus? – Clemens

+0

@Clemens Code für Konverter hinzugefügt. –

+0

Gibt es einen Grund, warum Sie keine [CropedBitmap] (https://msdn.microsoft.com/en-us/library/system.windows.media.imaging.cropedbitmap (v = vs.110) .aspx) verwenden? – Clemens

Antwort

0

Das Problem mithilfe der CroppedBitmap Klasse (vorgeschlagen von Clemens in den Kommentaren) gelöst wurde. Ich kenne den Grund nicht, aber unten ist der Code, den ich verwendet habe:

public object Convert(object value,Type targetType,object parameter,CultureInfo cultureInfo) 
{ 
    try 
    { 
     if (value is Tuple<Tuple<int, int, int, int>, string>) 
     { 
      Tuple<Tuple<int, int, int, int>, string> tuple = value as Tuple<Tuple<int, int, int, int>, string>; 
      Tuple<int, int, int, int> rectDims = tuple.Item1; 
      string filePath = tuple.Item2; 
      using (MyDocument doc = MyDocument.Load(filePath)) 
      { 
       var size = doc.Size; 
       int width = (int)(size.Width); 
       int height = (int)(size.Height); 
       Rectangle cropSection = new Rectangle(rectDims.Item1, rectDims.Item3, Math.Abs(rectDims.Item1 - rectDims.Item2), Math.Abs(rectDims.Item3 - rectDims.Item4)); 
       using (Image image = doc.Render(0, width, height, 300, 300, false)) 
       { 
        BitmapSource sourceImage = BitmapHelper.ToBitmapSource(image); 
        CroppedBitmap croppedImage = new CroppedBitmap(sourceImage,new System.Windows.Int32Rect(cropSection.X,cropSection.Y,cropSection.Width,cropSection.Height)); 
        return croppedImage; 
       } 
      } 
     } 
     else 
     { 
      return null; 
     } 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 
Verwandte Themen