C# 缩放时冻结某些控件(渲染为位图)
我正在尝试以各种大小拍摄WPF控件的快照,而不考虑原始控件的大小。假设控件的大小是300px的宽度和高度,我会尝试拍摄不同大小的快照,比如1500px的高度和宽度,100px的高度和宽度等等 下面是快照片段C# 缩放时冻结某些控件(渲染为位图),c#,wpf,scaling,C#,Wpf,Scaling,我正在尝试以各种大小拍摄WPF控件的快照,而不考虑原始控件的大小。假设控件的大小是300px的宽度和高度,我会尝试拍摄不同大小的快照,比如1500px的高度和宽度,100px的高度和宽度等等 下面是快照片段 objFramework.LayoutTransform = new ScaleTransform(actualWidth / requiredWidth, actualHeight / requiredHeight); re
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>
我为什么要这样
当拍摄不同大小的快照时,里面的文字看起来很模糊。因此,当重新渲染控件时,我们需要一个质量文本。 < P>如果您要考虑通过遍历整个显示堆栈来改变逻辑来循环,并且将RenderTransform设置在所有项目上而不是仅在容器上,这样的事情可能会起作用;p>
class NonScalableTextBlock : System.Windows.Controls.TextBlock
{
public Transform RenderTransform
{
get
{
return base.RenderTransform;
}
set
{
// do nothing
}
}
}
因此,当您不希望扩展时,您可以使用这个类来代替标准文本块
它隐藏其父级的LayoutTransform属性,因此您将覆盖它而不执行任何操作。出于某种原因,RenderTransform比LayoutTransform更适合我,不知道为什么。您不需要对控件应用任何转换。只需更改传递给RenderTargetBitmap构造函数的DPI值。 这样,控件将具有相同的逻辑大小,但只是更详细更高的分辨率
请参阅以获取示例。渲染图像时,恒定大小控件的大小是否正确?@mrtig,我无法理解您的意思,但复制所有子控件以不同的大小渲染并结束。它不是常数。我希望很少的控件在大小上保持不变。