2013-08-16 2 views
1

Я пытаюсь сделать снимок управления WPF в различных размерах независимо от исходного размера управления. Скажем, если размер управления составляет 300 пикселей по ширине и высоте, я пытаюсь сделать снимок с различными размерами, такими как высота и ширина 1500 пикселей, высота и ширина 100 пикселей и так далее.Заморозить определенные элементы управления при масштабировании (Render as Bitmap)

Вот снимок сниппет

 objFramework.LayoutTransform = 
      new ScaleTransform(actualWidth/requiredWidth, actualHeight/requiredHeight); 

      renderBitmap = new RenderTargetBitmap(requiredWidth, requiredHeight, 96d, 96d, PixelFormats.Pbgra32); 

      var dv = new DrawingVisual(); 
      using (DrawingContext ctx = dv.RenderOpen()) 
      { 
       var vb = new VisualBrush(objFramework); 
       ctx.DrawRectangle(vb, null, new Rect(0, 0, requiredWidth, requiredHeight)); 
      } 

      renderBitmap.Render(dv); 

Что я ищу:

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

<Grid> 
    <Border x:Name="brdTiles" VerticalAlignment="Center" HorizontalAlignment="Center" BorderThickness="1" BorderBrush="Black" > 
     <local:GridExtension x:Name="grdTileHolder" Background="#FFFFFF" > 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 

      <Grid.RowDefinitions> 
       <RowDefinition Height="25" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 


      <Grid Grid.Row="0" Grid.Column="1" x:Name="TileColumnHeader" >       
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="100" /> 
        <ColumnDefinition Width="100" /> 
        <ColumnDefinition Width="100" /> 
        <ColumnDefinition Width="100" /> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="25"></RowDefinition> 
       </Grid.RowDefinitions> 
       <ComboBox x:Name="grd1" Grid.Column="0" FontSize="10" Height="20" > 
        <ComboBoxItem Content="Item 1" /> 
        <ComboBoxItem Content="Item 2" /> 
        <ComboBoxItem Content="Item 3" /> 
       </ComboBox> 
       <TextBlock x:Name="txt1" Grid.Column="1" Text="20" FontSize="10" Height="20"/> 
       <TextBlock x:Name="txt2" Grid.Column="2" Text="30" FontSize="10" Height="20"/> 
       <TextBlock x:Name="txt3" Grid.Column="3" Text="40" FontSize="10" Height="20"/> 
      </Grid> 

      <Grid Grid.Column="0" Grid.Row="1" x:Name="TileRowHeader" > 
       <Grid.RowDefinitions> 
        <RowDefinition Height="100" /> 
        <RowDefinition Height="30" /> 
        <RowDefinition Height="30" /> 
        <RowDefinition Height="30" /> 
       </Grid.RowDefinitions> 

       <ComboBox HorizontalAlignment="Center" VerticalAlignment="Center" MinWidth="100" Grid.Row="0" > 
        <ComboBox.LayoutTransform> 
         <RotateTransform Angle="90" /> 
        </ComboBox.LayoutTransform> 
        <ComboBox.ItemsPanel> 
         <ItemsPanelTemplate> 
          <StackPanel Orientation="Vertical" IsItemsHost="True"> 
           <StackPanel.LayoutTransform> 
            <RotateTransform Angle="270" /> 
           </StackPanel.LayoutTransform> 
          </StackPanel> 
         </ItemsPanelTemplate> 
        </ComboBox.ItemsPanel> 
        <ComboBox.ItemContainerStyle> 
         <Style TargetType="ComboBoxItem"> 
          <Setter Property="LayoutTransform"> 
           <Setter.Value> 
            <RotateTransform Angle="0" /> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </ComboBox.ItemContainerStyle> 
        <ComboBoxItem>Hello</ComboBoxItem> 
        <ComboBoxItem>World</ComboBoxItem> 
        <ComboBoxItem>Foo</ComboBoxItem> 
        <ComboBoxItem>Check</ComboBoxItem> 
        </ComboBox> 


      <TextBlock Text="2" Grid.Row="1" /> 
       <TextBlock Text="3" Grid.Row="2" /> 
       <TextBlock Text="4" Grid.Row="3" /> 
      </Grid> 
      <Grid Grid.Row="1" Grid.Column="1" Margin="2" Name="TileViewGrid" Background="#FFFFFF" ShowGridLines="False" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
     </local:GridExtension> 
    </Border> 
</Grid> 

Почему я хочу, как этот

Когда берут снимок в различном размере, текст внутри выглядит расплывчатым. Поэтому при повторном рендеринге нам нужен качественный текст.

+0

При визуализации изображения постоянный размер контролирует правильный размер? – mrtig

+0

@mrtig, я не могу следовать за вами, но возьмите копию, все дочерние элементы управления получаются и заканчиваются разным размером. Это не константа. Я хочу, чтобы контроль был постоянным по размеру. – Mohanavel

ответ

0

Если вы решили изменить свою логику, чтобы пересечь весь стек, и установите RenderTransform для всех элементов, а не только для контейнера, возможно, что-то вроде этого будет работать;

class NonScalableTextBlock : System.Windows.Controls.TextBlock 
{ 
    public Transform RenderTransform 
    { 
     get 
     { 
      return base.RenderTransform; 
     } 

     set 
     { 
      // do nothing 
     } 
    } 
} 

(так, вы бы этого нужно просто использовать этот класс вместо стандартных TextBlocks, когда вы не хотите, чтобы масштабировать)

Она скрывает LayoutTransform свойства своего родителя, так что вы подменяют его не делать ничего , По какой-то причине RenderTransform работал лучше для меня, чем LayoutTransform, не зная почему.

0

Вам не нужно применять какие-либо преобразования к вашему контролю. Вы можете просто изменить значение DPI, которое вы передаете конструктору RenderTargetBitmap.
Таким образом, элемент управления будет иметь тот же логический размер, но более подробный (более высокое разрешение).

См. Пример High-Resolution Printing of WPF 3D Visuals.

Смежные вопросы