C # PrintVisual масштабируется до разрешения - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть окно WPF с некоторой информацией о нем, которое имеет заданный размер, точно 6 x 4 дюйма.

Если я пытаюсь распечатать его с локального ПК, оно работает, он печатает всю страницу, и все в порядке.

Проблема в том, что мы используем некоторые поддерживаемые вручную терминалы (Motorola Symbol), для которых установлено разрешение 240x320.

Всякий раз, когда я пытаюсьчтобы распечатать визуал с помощью терминала, я получаю страницу, которая отображается только частично, остальная часть печати полностью пуста.Похоже, что Windows пытается подогнать окно WPF к указанному разрешению, когда я вызываю Show, а затем печатает его.

WPF для окна:

<Window x:Class="Propuestas.UI.Andrei.PrintReport"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Propuestas.UI.Andrei" ResizeMode="NoResize"
    mc:Ignorable="d" WindowStyle="None" Background="White"
    Title="PrintReport" Height="601" Width="424">
<Grid Margin="5,10,0,0" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto" />
        <ColumnDefinition Width="105" />
    </Grid.ColumnDefinitions>
    <GroupBox Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.ColumnSpan="2" BorderThickness="0">
        <Label Background="{StaticResource logo}" HorizontalAlignment="Center" Width="275" Height="30"
                   Margin="0" />
    </GroupBox>

    <GroupBox Grid.Row="2" Grid.Column="0" BorderBrush="Black" Grid.ColumnSpan="2" Background="White">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="11" />
                <RowDefinition Height="11" />
                <RowDefinition Height="11" />
                <RowDefinition Height="11" />
                <RowDefinition Height="11" />
            </Grid.RowDefinitions>
            <Label Name="lblDIR1" Content="QUESERIA LAFUENTE S.A." Grid.Row="0" 
                   FontFamily="Verdana" FontSize="10" Padding="0" />
            <Label Content="ENTREGAR EN LA OFICINA" Grid.Row="1" Name="lblDIR2" 
                   FontFamily="Verdana" FontSize="10" Padding="0" />
            <Label Content="CTRA COLUNGA S/N" Grid.Row="2" Name="lblDIR3" Background="White" 
                   FontFamily="Verdana" FontSize="10" Padding="0" />
            <Label Content="ARRIONDAS" Grid.Row="3" Padding="0" Name="lblDIR4"  FontFamily="Verdana" FontSize="10" />
            <Label Content="33540       ASTURIAS"  Padding="0" Grid.Row="4" Name="lblDIR5" 
                   FontFamily="Verdana" FontSize="10"  />
        </Grid>
    </GroupBox>
    <GroupBox Grid.Row="1" Grid.Column="0" BorderBrush="Black" Grid.ColumnSpan="2" Width="378" >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto" />
                <RowDefinition Height="auto" />
                <RowDefinition Height="auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="auto" />
            </Grid.ColumnDefinitions>
            <Label Content="Embalaje: " Grid.Row="0" Grid.Column="0" FontFamily="Verdana" VerticalAlignment="Center"  VerticalContentAlignment="Center"/>
            <Label Content="Ref.: " Grid.Row="1" Grid.Column="0" FontFamily="Verdana" />
            <Label Content="Transportista: " Grid.Row="2" Grid.Column="0" FontFamily="Verdana" VerticalAlignment="Center"  VerticalContentAlignment="Center"/>
            <Label Name="lblNUMDOC" Content="2018999999 / 9999" Grid.Row="0" Grid.Column="0" Margin="65,0,0,0" FontFamily="Verdana" FontWeight="Bold" FontSize="14" />
            <Label Name="lblREF" Content="12314214211" Grid.Row="1" Grid.Column="0" Margin="35,0,0,0" FontFamily="Verdana" FontWeight="Bold" FontSize="14" />
            <Label Name="lblTRANSP" Content="METALUX ORIENTE - ORIENTE" Grid.Row="2" Grid.Column="0" Margin="85,0,0,0" VerticalAlignment="Center" VerticalContentAlignment="Center"
                   FontFamily="Verdana" FontSize="10.667" />
            <Label Content="47" Name="lblNUM" HorizontalAlignment="Right" VerticalAlignment="Center" Grid.Row="0" Grid.RowSpan="2" Grid.Column="2" Margin="35,0,0,0"
               FontWeight="Bold" FontSize="21.333" FontFamily="Verdana" Grid.ColumnSpan="2"  />
        </Grid>
    </GroupBox>
    <Grid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <DataGrid Name="dgLineas1" Grid.Column="0" AutoGenerateColumns="False" BorderBrush="Black"
                  Background="White" CanUserAddRows="False" HorizontalGridLinesBrush="Transparent" VerticalGridLinesBrush="Transparent" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Lin."  Binding="{Binding LINDOC}" TextBlock.TextAlignment="Center" />
                <DataGridTextColumn Header="Referencia" Binding="{Binding REFART}" Width="100" TextBlock.TextAlignment="Center" />
                <DataGridTextColumn Header="Cant." Binding="{Binding CANTIDAD}"  Width="60" TextBlock.TextAlignment="Center" />
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid Name="dgLineas2" Grid.Column="1" AutoGenerateColumns="False" BorderBrush="Black"
                  Background="White" CanUserAddRows="False" HorizontalGridLinesBrush="Transparent" VerticalGridLinesBrush="Transparent" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Lin."  Binding="{Binding LINDOC}" TextBlock.TextAlignment="Center" />
                <DataGridTextColumn Header="Referencia" Binding="{Binding REFART}" Width="100" TextBlock.TextAlignment="Center" />
                <DataGridTextColumn Header="Cant." Binding="{Binding CANTIDAD}"  Width="60" TextBlock.TextAlignment="Center" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
    <GroupBox Grid.Row="4" Grid.Column="0" Width="250" FontFamily="Code 128" BorderBrush="Transparent" Background="White" Height="120" Grid.ColumnSpan="2" >
        <StackPanel Orientation="Vertical">
        <Viewbox >
            <Label Content="230054800747" Name="lblCb" HorizontalAlignment="Center" Background="White"  VerticalAlignment="Center" FontFamily="PrecisionID C128 22 DEMO" FontSize="14" Width="219" Height="80" HorizontalContentAlignment="Center" VerticalContentAlignment="Top" Margin="10,0,9,0" RenderTransformOrigin="0.5,0.5"/>
        </Viewbox>
        <Label Name="lblCODEMB" Content="230054800747" HorizontalAlignment="Center" Grid.Row="1"
                   FontWeight="Bold" FontFamily="Verdana" FontSize="14" Margin="-5,0,-7,0" Width="131" />
        </StackPanel>
    </GroupBox>
</Grid>

икод, который я использую для его печати

var test = new PrintReport(NUMDOC, REF, TRANSP, NUM, DIR1, DIR2, DIR3, DIR4, DIR5, CODEMB, dt);
        var printDlg = new PrintDialog();
        test.Show();
        test.Close();
        var ip = UtilExpedicion.ImpresoraEtiquetas;
        foreach (var queue in new PrintServer().GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }))
        {
            if (queue.QueuePort.Name.Contains(ip))
            {

                var ticket = queue.DefaultPrintTicket;
                ticket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
                ticket.OutputQuality = OutputQuality.Photographic;
                queue.DefaultPrintTicket = ticket;
                queue.UserPrintTicket = ticket;
                printDlg.PrintQueue = queue;

                printDlg.PrintVisual(test, "");
            }
        }

Я полагаю, что это связано с Windows, в основном не создавая визуально что-то, что, по его предположению, не может быть показано в установленном разрешении.У меня есть WindowStyle to None и ResizeMode, установленный на NoResize, а также фиксированные Height и Width для окна.

В этом случае я пытаюсь использовать визуал, потому что он у нас уже был, и это спасло бы меняНекоторое время не нужно было создавать все в Crystal Reports (но я все еще не уверен, что это сработает)

Любая помощь очень ценится.

Позже Редактирование: Добавление всего вViewBox сделал все намного меньше, вышел на четверть от размера, но все элементы были там.Итак, это проблема разрешения.Теперь мне просто нужно смоделировать более высокое разрешение.F # me.

1 Ответ

0 голосов
/ 20 ноября 2018

Я бы попробовал rendertargetbitmap.

Приведенный ниже код сохраняет изображение элемента управления на диск в виде файла.Адаптируйте его так, чтобы он возвращал rtb, затем установите для него источник управления изображением в памяти.Затем вам, возможно, придется измерить и расположить изображение, чтобы оно соответствовало нужному размеру.Но я думаю, что это должно позволить вам создать изображение любого размера с любым разрешением, которое вы хотите, из сетки и его содержимого.Я включу все это, чтобы не пропустить какую-то часть.

        public void GeneratePng(Grid mapGrid, string pngURI)
        {
            double dpi = App.mvm.SelectedDPI;
            double scale = dpi / 96;
            Rect bounds = VisualTreeHelper.GetDescendantBounds(mapGrid);
            RenderTargetBitmap rt = new RenderTargetBitmap((int)(bounds.Width * scale),
                                                           (int)(bounds.Height * scale),
                                                            dpi,
                                                            dpi,
                                                            PixelFormats.Pbgra32);
            DrawingVisual dv = new DrawingVisual();
            using (DrawingContext ctx = dv.RenderOpen())
            {
                VisualBrush vb = new VisualBrush(mapGrid);
                ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size));
            }
            rt.Render(dv);
            PngBitmapEncoder png = new PngBitmapEncoder();
            png.Frames.Add(BitmapFrame.Create(rt));
            using (Stream streamPng = File.Create(pngURI))
            {
                png.Save(streamPng);
            }
        }

Я думаю, что я адаптировал это из некоторого фрагмента кода, который я нашел в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...