C# 将错误的纸张大小发送到打印机

C# 将错误的纸张大小发送到打印机,c#,.net,wpf,C#,.net,Wpf,我们已经开始了一个打印项目,但是在告诉打印机选择的纸张尺寸时,我们完全被卡住了 namespace CPrint { /// <summary> /// Логика взаимодействия для ucPrint.xaml /// </summary> public partial class ucPrint : UserControl { bool SystemChange = false;

我们已经开始了一个打印项目,但是在告诉打印机选择的纸张尺寸时,我们完全被卡住了

namespace CPrint
{
    /// <summary>
    /// Логика взаимодействия для ucPrint.xaml
    /// </summary>
    public partial class ucPrint : UserControl
    {
        bool SystemChange = false;
        double? PaperHeight = null;
        double? PaperWidth = null;
        public ucPrint()
        {
            InitializeComponent();
            App.Localization.AddControls(this, new string[]
             {
                    "cHeader", "lPrinter", "lCopies","lLayout", "bPrintSettings","lColorManagement","lPrinterProfile", "lPositionSize", "cCenter", "lTop", "lLeft"
             });
        }

        public static BitmapSource ConvertColorProfile(BitmapSource bitmapSource, ColorContext sourceProfile, ColorContext destinationProfile)
        {
            var bitmapConverted = new ColorConvertedBitmap();
            bitmapConverted.BeginInit();
            bitmapConverted.Source = bitmapSource;
            //bitmapConverted.SourceColorContext = new ColorContext(PixelFormats.Pbgra32);//  bitmapSourceFrame.ColorContexts == null ? sourceProfile : bitmapSourceFrame.ColorContexts[0];
            bitmapConverted.SourceColorContext = sourceProfile;
            bitmapConverted.DestinationColorContext = destinationProfile;
            bitmapConverted.DestinationFormat = PixelFormats.Bgra32;
            bitmapConverted.EndInit();
            return bitmapConverted;
        }

        private void BPrint_Click(object sender, RoutedEventArgs e)
        {
            if (cPrinter.SelectedItem == null) { MessageBox.Show("Printer not set"); return; }
            if (cPaperSize.SelectedItem == null) { MessageBox.Show("Paper size not set"); return; }


            double marging = 30;

            if (App.CurrentTemplateControl != null)
            {
                var img = App.CurrentTemplateControl.GetImage(true);
                if (img == null) return;
                var image = new Image() { Source = img };

                if (cColorProfile != null && cColorProfile.SelectedItem != null && cColorProfile.SelectedIndex > 0)
                {
                    Uri sourceProfileUri = new Uri((cColorProfile.SelectedItem as FileInfo).FullName);
                    image.Source = ConvertColorProfile(image.Source as BitmapSource, new ColorContext(PixelFormats.Pbgra32), new ColorContext(sourceProfileUri));
                }

                if (cMirror.IsChecked == true)
                {
                    var transformGroup = new TransformGroup();
                    transformGroup.Children.Add(new ScaleTransform(-1, 1, img.Width / 2, img.Height / 2));
                    image.RenderTransform = transformGroup;
                }
                PrintDialog printDialog2 = new PrintDialog();
                Size size = (Size)(cPaperSize.SelectedItem as ComboBoxItem).DataContext;
                printDialog2.PrintQueue = new PrintQueue(new PrintServer(), cPrinter.Text);


                //if (printDialog2.ShowDialog() == true)
                //{
                //Size size = new Size(printDialog2.PrintableAreaWidth, printDialog2.PrintableAreaHeight);

                printDialog2.PrintTicket = new PrintTicket()
                {
                    PageMediaSize = new PageMediaSize(size.Width, size.Height)
                };
                //printDialog2.PrintTicket
                Canvas canvas = new Canvas()
                {
                    //Height = PrintContext.ToPx(size.Height),
                    //Width = PrintContext.ToPx(size.Width),
                    Height = size.Height,
                    Width = size.Width,
                    Background = Brushes.White
                };
                canvas.Children.Add(image);

                double scaleW = (size.Width - marging * 2) / img.Width;
                double scaleH = (size.Height - marging * 2) / img.Height;
                if (scaleW < 1 || scaleH < 1)
                {
                    Canvas.SetLeft(image, marging);
                    Canvas.SetTop(image, marging);
                    double scale = scaleW > scaleH ? scaleH : scaleW;
                    var transformGroup = new TransformGroup();
                    transformGroup.Children.Add(new ScaleTransform(scale, scale, 0, 0));
                    image.RenderTransform = transformGroup;
                }
                else if (cCenter.IsChecked == true)
                {
                    Canvas.SetLeft(image, size.Width / 2 - img.Width / 2);
                    Canvas.SetTop(image, size.Height / 2 - img.Height / 2);
                }
                else
                {
                    Canvas.SetLeft(image, marging);
                    Canvas.SetTop(image, marging);
                }
                printDialog2.PrintVisual(canvas, "Print");
                //}
            }


            return;

        }

        private void CPrinter_DropDownOpened(object sender, EventArgs e)
        {
            SystemChange = true;
            var lastPrinterName = cPrinter.Text;
            cPrinter.Items.Clear();
            int index = -1;
            cPrinter.SelectedIndex = index;
            foreach (string strPrinter in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
            {
                index++;
                cPrinter.Items.Add(strPrinter);
                if (strPrinter == lastPrinterName)
                    cPrinter.SelectedIndex = index;
            }
            SystemChange = false;
        }

        private void CPrinter_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count > 0 && SystemChange == false)
            {
                var printer = new System.Drawing.Printing.PrinterSettings();
                printer.PrinterName = e.AddedItems[0].ToString();
                var lastPaperName = cPaperSize.Text;
                cPaperSize.Items.Clear();
                int index = -1;
                cPaperSize.SelectedIndex = index;
                foreach (System.Drawing.Printing.PaperSize paper in printer.PaperSizes)
                {
                    index++;
                    cPaperSize.Items.Add(new ComboBoxItem() { Content = paper.PaperName, DataContext = new Size(paper.Width, paper.Height) });
                    if (paper.PaperName == lastPaperName)
                        cPaperSize.SelectedIndex = index;
                }
                Properties.Settings.Default.DefaultDirectPrinter = printer.PrinterName;
                Properties.Settings.Default.Save();
            }
        }

        private void CPaperSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count > 0)
            {
                Properties.Settings.Default.DefaultDirectPaper = ((ComboBoxItem)e.AddedItems[0]).Content.ToString();
                Properties.Settings.Default.Save();
            }
        }

        public void UpdateControls()
        {
            SystemChange = true;

            if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.DefaultDirectPrinter))
            {
                SystemChange = true;
                var lastPrinterName = cPrinter.Text;
                cPrinter.Items.Clear();
                int index = -1;
                cPrinter.SelectedIndex = index;
                foreach (string strPrinter in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
                {
                    index++;
                    cPrinter.Items.Add(strPrinter);
                    if (strPrinter == Properties.Settings.Default.DefaultDirectPrinter)
                        cPrinter.SelectedIndex = index;
                }
                SystemChange = false;

                if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.DefaultDirectPaper))
                {
                    var printer = new System.Drawing.Printing.PrinterSettings();
                    printer.PrinterName = Properties.Settings.Default.DefaultDirectPrinter;
                    string lastPaperName = Properties.Settings.Default.DefaultDirectPaper;
                    cPaperSize.Items.Clear();
                    int indexP = -1;
                    cPaperSize.SelectedIndex = indexP;
                    foreach (System.Drawing.Printing.PaperSize paper in printer.PaperSizes)
                    {
                        indexP++;
                        cPaperSize.Items.Add(new ComboBoxItem() { Content = paper.PaperName, DataContext = new Size(paper.Width, paper.Height) });
                        if (paper.PaperName == lastPaperName)
                            cPaperSize.SelectedIndex = indexP;
                    }
                }
            }

            if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.DefaultDirectColorProfile))
            {
                var lastValue = Properties.Settings.Default.DefaultDirectColorProfile;
                cColorProfile.Items.Clear();
                int index = -1;
                cColorProfile.SelectedIndex = index;
                cColorProfile.Items.Add("");
                index++;
                foreach (var file in App.Icc.items)
                {
                    index++;
                    cColorProfile.Items.Add(file);
                    if (file.FullName == lastValue)
                        cColorProfile.SelectedIndex = index;
                }
            }
            SystemChange = false;
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {

        }

        private void CColorProfile_DropDownOpened(object sender, EventArgs e)
        {
            var lastValue = cColorProfile.Text;
            cColorProfile.Items.Clear();
            int index = -1;
            cColorProfile.SelectedIndex = index;
            cColorProfile.Items.Add("");
            index++;
            foreach (var file in App.Icc.items)
            {
                index++;
                cColorProfile.Items.Add(file);
                if (file.Name == lastValue)
                    cColorProfile.SelectedIndex = index;
            }
        }

        private void CColorProfile_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (!SystemChange)
            {
                Properties.Settings.Default.DefaultDirectColorProfile = (cColorProfile.SelectedItem as FileInfo)?.FullName;
                Properties.Settings.Default.Save();
            }
        }
    }
}
每次我们选择纸张尺寸并点击打印时,打印机预览都会显示A4,而不是我们选择的尺寸,尽管如果打开打印首选项,会选择正确的尺寸

namespace CPrint
{
    /// <summary>
    /// Логика взаимодействия для ucPrint.xaml
    /// </summary>
    public partial class ucPrint : UserControl
    {
        bool SystemChange = false;
        double? PaperHeight = null;
        double? PaperWidth = null;
        public ucPrint()
        {
            InitializeComponent();
            App.Localization.AddControls(this, new string[]
             {
                    "cHeader", "lPrinter", "lCopies","lLayout", "bPrintSettings","lColorManagement","lPrinterProfile", "lPositionSize", "cCenter", "lTop", "lLeft"
             });
        }

        public static BitmapSource ConvertColorProfile(BitmapSource bitmapSource, ColorContext sourceProfile, ColorContext destinationProfile)
        {
            var bitmapConverted = new ColorConvertedBitmap();
            bitmapConverted.BeginInit();
            bitmapConverted.Source = bitmapSource;
            //bitmapConverted.SourceColorContext = new ColorContext(PixelFormats.Pbgra32);//  bitmapSourceFrame.ColorContexts == null ? sourceProfile : bitmapSourceFrame.ColorContexts[0];
            bitmapConverted.SourceColorContext = sourceProfile;
            bitmapConverted.DestinationColorContext = destinationProfile;
            bitmapConverted.DestinationFormat = PixelFormats.Bgra32;
            bitmapConverted.EndInit();
            return bitmapConverted;
        }

        private void BPrint_Click(object sender, RoutedEventArgs e)
        {
            if (cPrinter.SelectedItem == null) { MessageBox.Show("Printer not set"); return; }
            if (cPaperSize.SelectedItem == null) { MessageBox.Show("Paper size not set"); return; }


            double marging = 30;

            if (App.CurrentTemplateControl != null)
            {
                var img = App.CurrentTemplateControl.GetImage(true);
                if (img == null) return;
                var image = new Image() { Source = img };

                if (cColorProfile != null && cColorProfile.SelectedItem != null && cColorProfile.SelectedIndex > 0)
                {
                    Uri sourceProfileUri = new Uri((cColorProfile.SelectedItem as FileInfo).FullName);
                    image.Source = ConvertColorProfile(image.Source as BitmapSource, new ColorContext(PixelFormats.Pbgra32), new ColorContext(sourceProfileUri));
                }

                if (cMirror.IsChecked == true)
                {
                    var transformGroup = new TransformGroup();
                    transformGroup.Children.Add(new ScaleTransform(-1, 1, img.Width / 2, img.Height / 2));
                    image.RenderTransform = transformGroup;
                }
                PrintDialog printDialog2 = new PrintDialog();
                Size size = (Size)(cPaperSize.SelectedItem as ComboBoxItem).DataContext;
                printDialog2.PrintQueue = new PrintQueue(new PrintServer(), cPrinter.Text);


                //if (printDialog2.ShowDialog() == true)
                //{
                //Size size = new Size(printDialog2.PrintableAreaWidth, printDialog2.PrintableAreaHeight);

                printDialog2.PrintTicket = new PrintTicket()
                {
                    PageMediaSize = new PageMediaSize(size.Width, size.Height)
                };
                //printDialog2.PrintTicket
                Canvas canvas = new Canvas()
                {
                    //Height = PrintContext.ToPx(size.Height),
                    //Width = PrintContext.ToPx(size.Width),
                    Height = size.Height,
                    Width = size.Width,
                    Background = Brushes.White
                };
                canvas.Children.Add(image);

                double scaleW = (size.Width - marging * 2) / img.Width;
                double scaleH = (size.Height - marging * 2) / img.Height;
                if (scaleW < 1 || scaleH < 1)
                {
                    Canvas.SetLeft(image, marging);
                    Canvas.SetTop(image, marging);
                    double scale = scaleW > scaleH ? scaleH : scaleW;
                    var transformGroup = new TransformGroup();
                    transformGroup.Children.Add(new ScaleTransform(scale, scale, 0, 0));
                    image.RenderTransform = transformGroup;
                }
                else if (cCenter.IsChecked == true)
                {
                    Canvas.SetLeft(image, size.Width / 2 - img.Width / 2);
                    Canvas.SetTop(image, size.Height / 2 - img.Height / 2);
                }
                else
                {
                    Canvas.SetLeft(image, marging);
                    Canvas.SetTop(image, marging);
                }
                printDialog2.PrintVisual(canvas, "Print");
                //}
            }


            return;

        }

        private void CPrinter_DropDownOpened(object sender, EventArgs e)
        {
            SystemChange = true;
            var lastPrinterName = cPrinter.Text;
            cPrinter.Items.Clear();
            int index = -1;
            cPrinter.SelectedIndex = index;
            foreach (string strPrinter in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
            {
                index++;
                cPrinter.Items.Add(strPrinter);
                if (strPrinter == lastPrinterName)
                    cPrinter.SelectedIndex = index;
            }
            SystemChange = false;
        }

        private void CPrinter_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count > 0 && SystemChange == false)
            {
                var printer = new System.Drawing.Printing.PrinterSettings();
                printer.PrinterName = e.AddedItems[0].ToString();
                var lastPaperName = cPaperSize.Text;
                cPaperSize.Items.Clear();
                int index = -1;
                cPaperSize.SelectedIndex = index;
                foreach (System.Drawing.Printing.PaperSize paper in printer.PaperSizes)
                {
                    index++;
                    cPaperSize.Items.Add(new ComboBoxItem() { Content = paper.PaperName, DataContext = new Size(paper.Width, paper.Height) });
                    if (paper.PaperName == lastPaperName)
                        cPaperSize.SelectedIndex = index;
                }
                Properties.Settings.Default.DefaultDirectPrinter = printer.PrinterName;
                Properties.Settings.Default.Save();
            }
        }

        private void CPaperSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.AddedItems.Count > 0)
            {
                Properties.Settings.Default.DefaultDirectPaper = ((ComboBoxItem)e.AddedItems[0]).Content.ToString();
                Properties.Settings.Default.Save();
            }
        }

        public void UpdateControls()
        {
            SystemChange = true;

            if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.DefaultDirectPrinter))
            {
                SystemChange = true;
                var lastPrinterName = cPrinter.Text;
                cPrinter.Items.Clear();
                int index = -1;
                cPrinter.SelectedIndex = index;
                foreach (string strPrinter in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
                {
                    index++;
                    cPrinter.Items.Add(strPrinter);
                    if (strPrinter == Properties.Settings.Default.DefaultDirectPrinter)
                        cPrinter.SelectedIndex = index;
                }
                SystemChange = false;

                if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.DefaultDirectPaper))
                {
                    var printer = new System.Drawing.Printing.PrinterSettings();
                    printer.PrinterName = Properties.Settings.Default.DefaultDirectPrinter;
                    string lastPaperName = Properties.Settings.Default.DefaultDirectPaper;
                    cPaperSize.Items.Clear();
                    int indexP = -1;
                    cPaperSize.SelectedIndex = indexP;
                    foreach (System.Drawing.Printing.PaperSize paper in printer.PaperSizes)
                    {
                        indexP++;
                        cPaperSize.Items.Add(new ComboBoxItem() { Content = paper.PaperName, DataContext = new Size(paper.Width, paper.Height) });
                        if (paper.PaperName == lastPaperName)
                            cPaperSize.SelectedIndex = indexP;
                    }
                }
            }

            if (!String.IsNullOrWhiteSpace(Properties.Settings.Default.DefaultDirectColorProfile))
            {
                var lastValue = Properties.Settings.Default.DefaultDirectColorProfile;
                cColorProfile.Items.Clear();
                int index = -1;
                cColorProfile.SelectedIndex = index;
                cColorProfile.Items.Add("");
                index++;
                foreach (var file in App.Icc.items)
                {
                    index++;
                    cColorProfile.Items.Add(file);
                    if (file.FullName == lastValue)
                        cColorProfile.SelectedIndex = index;
                }
            }
            SystemChange = false;
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {

        }

        private void CColorProfile_DropDownOpened(object sender, EventArgs e)
        {
            var lastValue = cColorProfile.Text;
            cColorProfile.Items.Clear();
            int index = -1;
            cColorProfile.SelectedIndex = index;
            cColorProfile.Items.Add("");
            index++;
            foreach (var file in App.Icc.items)
            {
                index++;
                cColorProfile.Items.Add(file);
                if (file.Name == lastValue)
                    cColorProfile.SelectedIndex = index;
            }
        }

        private void CColorProfile_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (!SystemChange)
            {
                Properties.Settings.Default.DefaultDirectColorProfile = (cColorProfile.SelectedItem as FileInfo)?.FullName;
                Properties.Settings.Default.Save();
            }
        }
    }
}
namespace CPrint
{
/// 
///ucPrint.xaml
/// 
公共部分类ucPrint:UserControl
{
bool-SystemChange=false;
双精度?纸张高度=空;
double?纸张宽度=空;
公共印刷品()
{
初始化组件();
App.Localization.AddControls(此,新字符串[])
{
“cHeader”、“lPrinter”、“lCopies”、“lLayout”、“bPrintSettings”、“lColorManagement”、“lPrinterProfile”、“LPPositionSize”、“cCenter”、“lTop”、“lLeft”
});
}
公共静态BitmapSource ConvertColorProfile(BitmapSource BitmapSource、ColorContext sourceProfile、ColorContext destinationProfile)
{
var bitmapConverted=新的ColorConvertedBitmap();
bitmapConverted.BeginInit();
bitmapConverted.Source=bitmapSource;
//bitmapConverted.SourceColorContext=new ColorContext(PixelFormats.Pbgra32);//bitmapSourceFrame.ColorContexts==null?sourceProfile:bitmapSourceFrame.ColorContexts[0];
bitmapConverted.SourceColorContext=sourceProfile;
bitmapConverted.DestinationColorContext=destinationProfile;
bitmapConverted.DestinationFormat=PixelFormats.Bgra32;
bitmapConverted.EndInit();
返回位图转换;
}
私有无效b打印\u单击(对象发送方,路由目标)
{
如果(cpinter.SelectedItem==null){MessageBox.Show(“打印机未设置”);返回;}
如果(cPaperSize.SelectedItem==null){MessageBox.Show(“未设置纸张大小”);返回;}
双边缘=30;
如果(App.CurrentTemplateControl!=null)
{
var img=App.CurrentTemplateControl.GetImage(true);
if(img==null)返回;
var image=newimage(){Source=img};
如果(cColorProfile!=null&&cColorProfile.SelectedItem!=null&&cColorProfile.SelectedIndex>0)
{
Uri sourceProfileUri=新Uri((cColorProfile.SelectedItem as FileInfo).FullName);
image.Source=ConvertColorProfile(image.Source作为位图源,新的ColorContext(PixelFormats.Pbgra32),新的ColorContext(sourceProfileUri));
}
如果(cmiror.IsChecked==true)
{
var transformGroup=new transformGroup();
添加(新的ScaleTransform(-1,1,img.Width/2,img.Height/2));
image.RenderTransform=transformGroup;
}
PrintDialog printDialog2=新建PrintDialog();
大小大小=(大小)(cPaperSize.SelectedItem作为ComboBoxItem);
printDialog2.PrintQueue=新的PrintQueue(新的PrintServer(),cPrinter.Text);
//if(printDialog2.ShowDialog()==true)
//{
//大小大小=新大小(printDialog2.PrintableAreaWidth,printDialog2.PrintableAreaHeight);
printDialog2.PrintTicket=新的PrintTicket()
{
PageMediaSize=新的PageMediaSize(size.Width、size.Height)
};
//printDialog2.PrintTicket
Canvas Canvas=newcanvas()
{
//高度=PrintContext.ToPx(size.Height),
//宽度=PrintContext.ToPx(size.Width),
高度=尺寸。高度,
宽度=大小。宽度,
背景=画笔。白色
};
canvas.Children.Add(图像);
双刻度=(size.Width-marging*2)/img.Width;
双刻度=(尺寸高度-边缘*2)/img高度;
if(scaleW<1 | | scaleH<1)
{
Canvas.SetLeft(图像、边框);
Canvas.SetTop(图像、边框);
双刻度=scaleW>scaleH?scaleH:scaleW;
var transformGroup=new transformGroup();
添加(新的ScaleTransform(scale,scale,0,0));
image.RenderTransform=transformGroup;
}
else if(cCenter.IsChecked==true)
{
Canvas.SetLeft(图像,size.Width/2-img.Width/2);
Canvas.SetTop(图像,大小.高度/2-img.高度/2);
}
其他的
{
Canvas.SetLeft(图像、边框);
Canvas.SetTop(图像、边框);
}
printDialog2.PrintVisual(画布,“打印”);
//}
}
返回;
}
私有void cpinter_dropdownOpen(对象发送方,事件参数e)
{
SystemChange=true;
var lastPrinterName=cPrinter.Text;
cpinter.Items.Clear();
int指数=-1;
cpinter.SelectedIndex=索引;
foreach(系统中的字符串字符串strPrinter.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
索引++;
cPrinter.Items.Add(strPrinter);
if(strPrinter==lastPrinterName)
cpinter.SelectedIndex=索引;
}
SystemChange=false;
}
私有无效CPInter_SelectionChanged(对象发送方,SelectionChangedEventArgs e)
{
如果(e.AddedItems.Count>0&&SystemChange==false)