Laden...

Forenbeiträge von el_vital Ingesamt 346 Beiträge

30.08.2016 - 11:45 Uhr

Das funktioniert bis CanGoBack == false. Ich möchte aber, dass auf dem Phone die App in dem letzten Frame in den Hintergrund geht wie bei dem Back-Button des Systems.

Der Befehl Application.Current.Exit() schließt die App komplett. Ich habe nichts gefunden womit die App einfach auf inaktiv gesetzt wird. Das geht nur mit dem System Back-Button in dem Haupt-Frame.

30.08.2016 - 11:03 Uhr

Ist es möglich das GetForCurrentView().BackRequested Event selbst aufrufen?

Ich möchte auf der Oberfläche eigenen Back-Button platzieren. Wenn der User auf den Button klickt, soll das Event GetForCurrentView().BackRequested aufgerufen werden.

31.07.2015 - 20:08 Uhr

Also Abt, solche Beiträge wie deiner nerven mich gewaltig.
Ich habe mehrfach geschrieben. Unterschiedliche Rechner, unterschiedliche WPF Anwendungen, Windows 7 in unterschiedlichen Versionen: überall das gleiche Problem.

Ausserdem reicht es beim Windows-Start im Autostart eine kleine WPF Anwendung mit einem ausgeblendetem Window kurz zu starten und sofort wieder zu beenden, damit jede beliebige WPF Anwendung anschließend schnell startet.

Dieses arrogante Bla, Bla kannst du für dich behalten. Ich weiß ganz genau wie .Net funktioniert. Ich habe ein konkretes Problem beschrieben. Hast du das Verhalten getestet??

31.07.2015 - 08:05 Uhr

Weiter würde ich gerne nachfragen:
Bist du sicher das es am .NET Framework liegt und nicht evtl. an anderen Komponenten wie zum Beispiel dem SQL Server den du aus deiner Anwendung heraus verwendest?
Aus Erfahrung zum Beispiel weiß ich das ein neu gestarteter SQL Server auch erst mal ein bisschen Zeit braucht um warm zu werden.

Eine leere WPF Anwendung ohne jegliche DLL's/SQL Nutzung hat ebenfalls dieses Verhalten.
Ngen habe ich bereits ausprobiert, bringt garnichts, da es wirklich um das "laden" des Frameworks bei der ersten Ausführung einer WPF Anwendung geht.

Ich werde schon eine Lösung finden und hier posten.

30.07.2015 - 21:24 Uhr

Es geht doch nicht um Glauben. Auf Windows 8.1 starten WPF Programme nach Windows-Start ohne Verzögerung. Bei Windows 7 und früher bei Windows XP eben nicht. Das hat schon etwas mit dem Betriebssystem zu tun. Bei Windows 8 wird vielleicht ein WPF Programm als Bestandteil des Betriebssystems beim Start ausgeführt. Dadurch starten WPF Programm auch sofort.

Ich suche nach einem Weg unter Windows 7 das .Net Framework bei Windows-Start vollständig zu "laden". Ich habe in einem Forum etwas von einem Registry-Eintrag gelesen. Dort wurde auf Infos auf einer Microsoft-Seite verwiesen. Die Seite ist aber leider nicht mehr erreichbar.

Ist das Problem wirklich noch keinem aufgefallen?

30.07.2015 - 16:52 Uhr

Ein anderer Beweis, dass es nicht an der Anwendung selbst liegt:

  1. Nach Windows Start WPF Anwendung X starten: dauert sehr lange
  2. WPF Anwendung X nochmal starten: startet sehr schnell
  3. Jetzt WPF Anwendung Y starten: startet auch sehr schnell
  4. Windows neu starten
  5. WPF Anwendung Y starten: dauert sehr lange

Es ist egal welche WPF Anwendung zuerst nach Neustart ausgeführt wird. Danach starten alle WPF Anwendungen schnell.

Dass es ein generelles Win7/.net-Problem ist kann ich nicht bestätigen.

Ist auf allen Windows 7 Rechnern mit beliebigen WPF Programmen so.
Kannst du selber schnell testen. Erstell eine neue WPF Anwendung in VS. Kompiliere das Projekt. Starte den Rechner neu. Gib dem Betriebssystem genug Zeit um komplett durchzustarten. Starte jetzt die WPF Anwendung. Der Start wird dauern. Schließ die Anwendung und starte nochmal. Das Programm ist sofort da.

30.07.2015 - 16:40 Uhr

Hallo gfoidl,

der Artikel hat mit dem Problem nichts zu tun. Eine leere Anwendung ohne Funktion ohne Veränderungen nach Projekterzeugung startet nach einem Windows-Start extrem lange. Das ist ein allgemeines Problem von .Net/WPF unter Windows 7.

Bei Windows Forms gibt es das Problem nicht.

30.07.2015 - 16:23 Uhr

Wenn eine WPF Anwendung (egal welche) nach einem Windows-Start (egal ob direkt nach dem Start oder eine Stunde später) gestartet wird, dann dauert es länger als 5 Sekunden bis die Anwendung startet. Schießt man die Anwendung und startet die nochmal, ist die sofort da.

Dieses Verhalten kommt wohl davon, dass das .NET Framework bei dem Windows-Start nicht vollständig geladen wird. Bei dem ersten Start einer WPF Anwendung werden dafür benötigte Sachen nachgeladen. Dieses Verhalten kann auf einem beliebigen Windows 7 Rechner beobachtet werden. Bei dem Windows 8.1 Rechner ist das Problem nicht mehr vorhanden.

Kennt jemand eine Möglichkeit das Betriebssystem zu zwingen nach dem Start das .Net Framework automatisch vollständig zu initialisieren? Eine unsichtbare WPF Anwendung im Autostart ist keine Option 😃

23.03.2015 - 12:45 Uhr

Wie Du vermutlich auch gesehen hast, steht in den Antworten jedoch das gleiche.

Das Binding schließt im übrigen nicht aus, dass die Controls unterschiedlich aussehen.

Ja, ist richtig. Ich habe es jetzt wie von dir vorgeschlagen umgesetzt und es funktioniert. Auch das Aussehen wird über Binding von zum Beispiel einem Brush als Background gesteuert.

Das Einzige, was nicht geklappt hat ist das Binding von Methoden anstelle von Properties. Das wollte ich machen weil ich die Objekte serialisiere und ein Brush nicht serialisierbar ist. Ich hätte die Farbe gerne als Hex-String oder als Color serialisiert und in einer Methode GetColor() ein Brush zurück geliefert. Die Methode GetColor() konnte ich aber nicht "binden".

21.03.2015 - 22:55 Uhr

Das ist ein "Bug" der Combobox.
Es ist hier vom user128300 beschrieben: http://stackoverflow.com/questions/24008310/wpf-binding-in-combobox-with-usercontrol-list

21.03.2015 - 22:31 Uhr

Hi,

dein Control erhält das entsprechende Item in der Liste als DataContext. Deine Liste sollte also nicht die UserControls dafür enthalten, sondern den nötigen DataContext bzw. das ViewModel.

Falls das Fragen aufwirfst, such hier im Forum z.B. mal nach MVVM.

Gruß
t0ms3n

Ich möchte schon, dass mein UserControl das zu darstellende Objekt ist. Also, dass die Liste die UserConstrolls enthält. Das was für Daten und in welcher Form in der ComboBox zu sehen sind, soll das jeweilige UserControl entscheiden. Jedes Element könnte also in der ComboBox anders aussehen, abhängig von dem Zustand und den Daten des UserControls.

20.03.2015 - 21:31 Uhr

Hallo t0ms3n,
ich bekomme das leider nicht richtig zum Laufen.

Ich habe folgendes als ItemTemplate zugewiesen:


 <ComboBox.ItemTemplate>
                <DataTemplate>
                    <local:UserControlComboBoxElementWS/>
                </DataTemplate>
            </ComboBox.ItemTemplate>

und folgendes als ItemsSource="{Binding UserControlList}"

In dem C# Code:


        ObservableCollection<UserControlComboBoxElementWS> _UserControlList = new ObservableCollection<UserControlComboBoxElementWS>();
        public ObservableCollection<UserControlComboBoxElementWS> UserControlList
        {
            get
            {
                return _UserControlList;
            }
            set
            {
                _UserControlList = value;
            }
        }

Dann erzeuge ich 10 Objekte des UserControlComboBoxElementWS, fülle die mit Daten und füge die der Liste UserControlList hinzu. Es werden auch 10 Elemente in der Combobox angezeigt. Jedoch ohne Daten. Wenn ich solch ein UserControlComboBoxElementWS direkt auf der Oberfläche platziere und dem Control Daten zuweise, dann werden diese angezeigt.

Jedes Mal wenn ich die Combobox öffne, werden aus irgendeinem Grund 10 neue Objekte mit dem Aufruf des leeren Konstruktors erzeugt und dadurch sind die Elemente ohne Daten. Ich weiß leider nicht was ich falsch mache.

15.03.2015 - 12:46 Uhr

Gibt es eine Möglichkeit bei einer ComboBox in WPF UserControls als Items zu verwenden?
Wie zum Bespiel in diesem Bild:

25.09.2014 - 12:00 Uhr

Ich hatte bei dem Image noch CacheMode auf BitmapCache gesetzt. Das hat alle anderen Einstellungen außer Kraft gesetzt. Nachdem ich CacheMode="BitmapCache" entfernt hatte, funktionierte alles.

25.09.2014 - 11:15 Uhr

Wenn ich ein Bild unter WPF in ein System.Windows.Controls.Image lade und auf das Image eine ScaleTransform mit 0.5 anwende, dann wird das Bild viel zu scharf dargestellt. Ich hätte es gerne etwas weicher.

Ich habe bereits mit BitmapScalingMode, SnapsToDevicePixels und UseLayoutRounding rumgespielt. Das bild bleibt beim Sacalieren unverändert zu scharf.

Kennt vielleicht jemand noch ein Trick?

Mir fehlen bei WPF folgende Sachen:

  • CompositingQuality
  • InterpolationMode
  • SmoothingMode
18.03.2013 - 21:24 Uhr

Hallo,

ich verkaufe seit ca. einem Jahr Apps in dem Apple Store. Dort ist alles eindeutig geregelt und die steuerliche Abrechnung recht einfach. Nach einer Auszahlung seitens Apple, wird von mir eine Rechnung ohne UmsSt. ausgestellt und an Apple per Internetformular übermittelt. Für die Erstellung der Rechnung wird die Adresse von Apple in Luxemburg und deren VAT No. (USt. Id.) verwendet. Apple kümmert sich selbst um die Steuern in allen Ländern.

Nun habe ich die erste Auszahlung von Microsoft für Verkäufe in dem Windows Store erhalten. In dem Store habe ich bei den Apps nur die Ländern aktiviert, in denen Microsoft automatisch die Steuern abführt. Somit ist die steuerliche Lage ebenfalls eindeutig. Jedoch kann ich keine Rechnung ausstellen, da nirgendwo die Anschrift und die UStId von Microsoft zu finden ist. Es gibt sicherlich viele Microsoft Gesellschaften. Ich habe keine Ahnung welche der Vertragspartner im Store ist. Diese Information ist nicht da oder gut versteckt. Es ist wirklich eine Katastrophe. In dem Bescheid über die Auszahlung oder in anderen "Dokumenten" steht nur Microsoft. Keine weiteren Daten.

Nun weiß weder meine Steuerberaterin noch ich wie mit den Zahlungen umzugehen ist.

Hat einer von euch ähnliche Erfahrungen oder die fehlenden Informationen?
Bei mir geht es um den Windows Store, aber in dem Windows Phone Store wird es wohl ähnlich sein.

22.12.2012 - 21:58 Uhr

Ich nutze jetzt den "Crypto Obfuscator For .Net" von LogicNP Software.
Damit funktioniert es gut und meine App wurde erfolgreich zertifiziert und in den Shop gestellt.

22.12.2012 - 13:40 Uhr

Ich habe eben gesehen, dass die appx-Datei neben der EXE und den DLL's auch die xaml Dateien im Klartext beinhaltet.

Wenn das alles in dem WindowsApps Ordner landet, ist es auch unschön

22.12.2012 - 12:36 Uhr

Ich verstehe es schon. Ich möchte nur nicht, dass jeder Hinz und Kunz, der ein Programm zum wandeln in den sichtbaren Code nicht hat oder damit nicht umgehen kann, meine app vollständig oder in Teilen ohne Aufwand kopieren kann.

21.12.2012 - 19:57 Uhr

Es geht mir bei dieser App nicht um Business-Logic oder um Daten.
Es geht um von mir programmierte Benutzersteuerelemente und bestimmte Algorithmen.

Es ist mir klar, dass es wieder in einigermaßen brauchbaren Code wandeln kann, aber ich möchte durch Obfuscator verhindern, dass meine App mit einem etwas anderem Aussehen und einem anderen Namen eine Woche später mehrfach in dem Store landet.

Es ist keine sehr komplexe App, aber etwas Programmieraufwand steckt schon drin.

Den Code in klarer Form zu lassen wäre Wahnsinn.

21.12.2012 - 12:39 Uhr

Ich werde mir ein Programm kaufen und hier berichten. Ich hätte nach der Beschreibung des Herstellers gerne den ".Net Obfuscation | Dotfuscator" in PRO von preemptive.com, aber dort ist nichteinmal ein Preis angegeben.

21.12.2012 - 11:11 Uhr

Mit einer Demo-Version behandelte App reiche ich doch nicht bei MS ein.
Ich würde gerne Erfahrungen von Leuten hören die bereits ein Obfuscator bei einer eingereichten Windows Store App erfolgreich genutzt haben.

Und ich habe bei keinem der Hersteller auf der Webseite genaue Informationen zu deren Programmen im Bezug auf WinRT gefunden. Höhstens Werbetexte, dass es jetzt auch mit WinRT funktioniert. Mehr leider nicht.

20.12.2012 - 13:35 Uhr

Wie soll mir der Link helfen? Dort wird nicht erwähnt mit welchem Obfuscator es funktioniert.

Bevor ich jetzt 200$ und mehr für einen obfuscator ausgebe, würde ich gerne sicher sein, dass der auch wirklich mit WinRt funktioniert und ob behandelte Apps durch die Kontrolle von Microsoft durchkommen.

20.12.2012 - 12:39 Uhr

Hat schon jemand einen obfuscator erfolgreich bei WinRT Apps benutzt?
Ich möchte eine App einrechen. Aber davor möchte ich es mit einem Obfuscator bearbeiten. Noch gibt es nicht viele Informationen dazu. Weder bei den Entwicklern von den Obfuscators, noch allgemein im Netz.

21.11.2012 - 10:14 Uhr

Nein, ich habe es nicht in einem Click-Event ausgeblendet.
Mit einem Click-event habe ich eine asynchrone Funktion zum Öffnen eines Bildes von der Festplatte gestartet. Am Ende dieser Funktion habe ich über eine Flag-Variable in einem zyklischen Timer die Funktion HideGridPleaseWait() aufgerufen.

20.11.2012 - 19:56 Uhr

Hallo winSharp93. Vielen Dank für deine Tipps.
Hiermit funktioniert es:



private async void HideGridPleaseWait()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
     gridPeaseWait.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
              
    });
}

private  voidgridPeaseWait_LayoutUpdated(objectsender, objecte)
{
    if(gridPeaseWait.Visibility == Windows.UI.Xaml.Visibility.Collapsed)
    {
            myImage.IsHitTestVisible = true;
    }
    else
    {
            myImage.IsHitTestVisible = false;
    }
}


19.11.2012 - 23:59 Uhr

Nicht ganz richtig. Image wird von einem Grid verdeckt, auf das Grid wird an der Position des Image geklickt, es passiert in dem Moment nichts (ist so gewollt). Jetzt wird das Grid ausgeblendet und in dem Augenblick wird das Click-Event gefeuert. Wie bereits geschrieben finde ich dieses Verhalten seltsam.

Ich glaube es hat doch nur etwas mit WinRT und Asynchronität zu tun. Normal dürfte so etwas nicht passieren.

19.11.2012 - 23:20 Uhr

Ich möchte, dass die Events nicht an das Image unter dem Grid geleitet werden, nachdem es wieder sichtbar ist.
Es scheinen sich die Events in einer Queue zu sammeln und wenn das Image wieder sichtbar ist, werden die ausgelöst.

19.11.2012 - 22:16 Uhr

Ich habe auch schon probiert auszublenden:


gridControlls.Visibility = Windows.UI.Xaml.Visibility.Collapsed;

Sobald ich es einblende werden die Events genau so aufgerufen.

19.11.2012 - 22:04 Uhr

Es geht um eine WinRT Anwendung, aber das Verhalten ist bei WPF und Silverlight gleich.

Ich habe ein Image mit einem Click-Event. Dadrüber wird ein Grid eingeblendet.
Wenn auf dem Grid genau auf der Position des Images geklickt wird, dann wird das Click.Event an das Image weiter gereicht, wenn das Grid ausgeblendet wird.
Das ist wirklich seltsam. Ich müßte die Weitergabe des Events blockieren.

Hat jemand eine Idee wie das geht?

03.11.2012 - 14:55 Uhr

Nach einer Denkblockade habe ich die Lösung nun doch noch gefunden.

Hier ist der Code:


   // Neue Skalierung und Position berechnen

                double scaleNew = (canvasWidthNew * transform.ScaleX) / canvasWidthOld;
                double scaleOld = transform.ScaleX;

                double dX_NullPosOld = (imageBild.Width - canvasWidthOld) / 2;
                double dX_NullPosNew = (imageBild.Width - canvasWidthNew) / 2;

                double dY_NullPosOld = (imageBild.Height - canvasHeightOld) / 2;
                double dY_NullPosNew = (imageBild.Height - canvasHeightNew) / 2;

                double dOldXdiff = -dX_NullPosOld - transform.TranslateX;
                double dOldYdiff = -dY_NullPosOld - transform.TranslateY;

                double dNewXoffset = dOldXdiff * (canvasWidthNew / canvasWidthOld);
                double dNewYoffset = dOldYdiff * (canvasHeightNew / canvasHeightOld);

                // Neue Positionen zuweisen
                transform.TranslateX = -dX_NullPosNew - dNewXoffset;
                transform.TranslateY = -dY_NullPosNew - dNewYoffset;

                // Neue Skalierung zuweisen
                transform.ScaleY = transform.ScaleX = scaleNew;


03.11.2012 - 11:19 Uhr

Ja, ich hänge bei der Positionierung. In deinem Vorschlag wird die bisherige Position nicht berücksichtigt.

Ich habe schon vieles versucht. Ich mache gleich ein kleines Demo Projekt und lade es irgendwo hoch.

03.11.2012 - 10:54 Uhr

So sollte das Bild nach Vergrößerung des Canvas positioniert werden:

03.11.2012 - 10:52 Uhr

Hallo,

ich bekomme die richtige Positionierung nach dem Vergrößern des Canvas nicht hin. Bin schon seit zwei Tagen mit dem Problem beschäftigt und komme einfach nicht weiter. Vielleicht weiß hier jemand auf Anhieb wie das Bild richtig zu positionieren ist!?

Ich habe zum Beispiel ein Canvas 250 x 250 Pixel, Das Canvas hat ein Image als Child.
Diesem Image ist ein Bild mit der Größe 1683 x 2500 Pixel zugeordnet. Dem Bild ist eine Transformation vom Typ RenderTransform zugewiesen. Über die Transformation wird das Bild mit ScaleX und ScaleY unter Einhaltung der Proportionen skaliert. (in diesem Fall verkleinert)
Mit TranslateX und TranslateY wird es in der Canvas bewegt. CanterX und CenterY sind auf Image.With/2 und Image.Height/2 gesetzt um das Bild um die Mitte rotieren zu können.

Die Rotation lassen wir aber erst mal außen vor. Das Bild ist nicht gedreht.

Das Bild wird verkleinert und nach rechts verschoben. (s. Anhang)

Nach einer Änderung des Layouts wird Canvas um das doppelte auf 500 x 500 Pixel vergrößert.

Nach dieser Größenänderung möchte ich das Bild proportional skalieren und positionieren so, dass es wie vorher aussieht. Wenn ich nichts mache ist das Bild kleiner und verschoben.

Skalieren geht wunderbar mit dem Dreisatz: transform.ScaleX = transform.ScaleY = (CanvasWidthNew*transform.ScaleX)/CanvasWidthOld;

Bei der Positionierung komme ich nicht weiter. Egal wie ich rechne ist es nicht da wo es sein sollte. Ich denke, dass mein Problem in dem CenterX und CenterY liegt. Die Skalierung erfolgt aus der Mitte heraus, die Positionierung aber von dem oberen linken Punkt und zwar bezogen auf Originalgröße des Bildes.

Kann mir jemand bei diesem Problem weiter helfen?

Vielen Dank im Voraus.

29.10.2012 - 18:02 Uhr

Ich habe es eben so implementiert. Es gibt vielleicht aber noch einen besseren Weg.


 <Grid Width="100" Height="100">
        <Grid.LayoutTransform>
            <RotateTransform CenterX="0.5" CenterY="0.5" Angle="45"/>
        </Grid.LayoutTransform>

        <Canvas>
            <Canvas.Clip>
                <RectangleGeometry Rect="0,0,48,48" />
            </Canvas.Clip>
            <Ellipse Height="100" HorizontalAlignment="Left"   Stroke="Red" VerticalAlignment="Top" Width="100" StrokeThickness="20" />
        </Canvas>
        <Canvas>
            <Canvas.Clip>
                <RectangleGeometry Rect="52,0,48,48" />
            </Canvas.Clip>
            <Ellipse Height="100" HorizontalAlignment="Left"   Stroke="Blue" VerticalAlignment="Top" Width="100" StrokeThickness="20" />
        </Canvas>

        <Canvas>
            <Canvas.Clip>
                <RectangleGeometry Rect="0,52,48,48" />
            </Canvas.Clip>
            <Ellipse Height="100" HorizontalAlignment="Left"   Stroke="Green" VerticalAlignment="Top" Width="100" StrokeThickness="20" />
        </Canvas>

        <Canvas>
            <Canvas.Clip>
                <RectangleGeometry Rect="52,52,48,48" />
            </Canvas.Clip>
            <Ellipse Height="100" HorizontalAlignment="Left" Stroke="Orange" VerticalAlignment="Top" Width="100" StrokeThickness="20" />
        </Canvas>
    </Grid>

29.10.2012 - 17:35 Uhr

Vielen Dank MrSparkle,

nach deinem Vorschlag sind die einzelne Segmente nicht getrennt änderbar. Ich müsste die Farben ändern können und Click Ereignisse abfangen.

29.10.2012 - 17:13 Uhr

Hallo,

hat jemand eine Idee wie ein geteilter Ring in XAML am einfachsten zu erstellen ist? (s. Anhang)

Die einzelnen Elemente sollen getrennt ansprechbar sein.

06.08.2012 - 21:27 Uhr

Ich muss gestehen, ich hatte einen Fehler in der Implementierung. Eine Zeile Code zu viel auskommentiert. Der Code aus dem Vorschlag von Chris360 funktioniert doch.

Danke an alle.

06.08.2012 - 06:19 Uhr

Hallo Chris360, ich hatte das bereits letzte Woche ausprobiert. Es funktieoniert alles, bis auf die Tatsache, dass die Standardeinstellungen nicht verändert werden. Das schreiben auch einige Leute in den Kommentaren. Ich habe es auf einem XP Rechner mit Admin-Rechten getestet.

05.08.2012 - 22:18 Uhr

Hallo MrSparkle,

ich muss die Druckeinstellungen für eine andere Anwendung anpassen. Also wirklich die Standarddruckeinstellungen. An der anderen Software aus der gedruckt wird kann ich keine Änderungen machen.

03.08.2012 - 12:58 Uhr

Ist es möglich in C# angepassten DefaultPrinterSettings eines Druckers dem Drucker als Standardeinstellung zurück zu schreiben?

Schon alles durchgesucht. Finde die Möglichkeit leider nicht.

11.06.2012 - 18:36 Uhr

So funktioniert es:

 
    [DllImport("winspool.Drv", EntryPoint = "DocumentPropertiesW", SetLastError = true, ExactSpelling = true,   CallingConvention = CallingConvention.StdCall)]
        static extern int DocumentProperties(
        IntPtr hwnd,
        IntPtr hPrinter,
        [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName,
        IntPtr pDevModeOutput,
        IntPtr pDevModeInput,    //removed ref
        int fMode);

        [DllImport("kernel32.dll")]
        static extern IntPtr GlobalLock(IntPtr hMem);

        [DllImport("kernel32.dll")]
        static extern bool GlobalUnlock(IntPtr hMem);

        [DllImport("kernel32.dll")]
        static extern bool GlobalFree(IntPtr hMem);

       private bool OpenPrinterPropertiesDialog(PrinterSettings printerSettings)
        {
            try
            {
                var handle = this.Handle;
                var hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
                var pDevMode = GlobalLock(hDevMode);
                var sizeNeeded = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, pDevMode, 0);
                var devModeData = Marshal.AllocHGlobal(sizeNeeded);
                iResult = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, pDevMode, 14);
                GlobalUnlock(hDevMode);
                printerSettings.SetHdevmode(devModeData);
                printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
                GlobalFree(hDevMode);
                Marshal.FreeHGlobal(devModeData);

            }
            catch {

                MessageBox.Show("Die Druckereinstellungen konnten leider nicht aufgerufen werden");
                
                return false;
            }

             return true;
        }



.....


PrinterSettings settings = new PrinterSettings();

.....


// Aufruf
  if (OpenPrinterPropertiesDialog(settings))
  {
       printPreviewControl1.Document.PrinterSettings = psSettings;
  }

.....

Wenn die Druckeinstellungen erneut aufgerufen werden, sind alle Einstellungen noch da. PrinterSettings können bei Bedarf serialisiert und bei Programmstart erneut aus der Datei de-serialisiert werden. Damit können die Einstellungen dauerhaft gespeichert werden. Die Einstellungen müssen Drucker abhängig gespeichert werden.

11.06.2012 - 11:36 Uhr

Ich habe eine Lösung gefunden. Ich schreibe es heute Abend hier rein.

31.05.2012 - 20:06 Uhr

Hallo,

ich ändere mit folgender Funktion die Druckereinstellungen:


 static extern int DocumentProperties(
  IntPtr hwnd,
  IntPtr hPrinter,
  [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName,
  IntPtr pDevModeOutput,
  ref IntPtr pDevModeInput,
  int fMode);

Nach Aufruf werden die Druckereinstellungen mit den Standardeinstellungen aufgerufen. Ich kann Änderungen vornehmen. Nach dem Schließen schreibe ich die Einstellungen in PrinterSettings und kann diese anschließend benutzen. Das funktioniert alles. Jetzt würde ich gerne die Druckereinstellungen mit den geänderten und in den PrinterSettings gespeicherten Daten öffnen. Das funktioniert leider nicht. Es wird immer mit den Standarddaten geöffnet.

Leider finde ich auch keine Informationen wie ich das machen könnte.

Hat jemend von euch vielleicht eine Idee?

01.05.2012 - 12:05 Uhr

Ja, die Idee hatte ich auch schon. Ich werde weiterhin nebenbei an einer Lösung arbeiten. Wenn ich etwas finde, dann schreibe ich es hier.

30.04.2012 - 23:33 Uhr

Hallo rongchaua,

danke für deinen Vorschlag. Leider hilft es mir nicht weiter. Die Einstellungen müssen nur für die Laufzeit des Programms übernommen werden. Global kann der Benutzer die Einstellungen auch unter "Drucken und Faxgeräte" vornehmen. Ich brauche aber die Funktion, dass global vielleicht Fotopapier eingestellt ist und der Benutzer in meinem Programm Normalpapier auswählen und drauf drucken kann, aber die globalen Einstellungen davon unberührt bleiben.

27.04.2012 - 21:15 Uhr

Mir war bis vor kurzem nicht klar, dass .Net solch einen Mangel beim Drucken aufweist. Den Benutzern vorzuschreiben die Einstellungen direkt unter "Drucker und Faxgeräte" vorzunehmen ist keine Lösung. Ich werde vielleicht ein extra Programm in einer nativen Sprache schreiben, welches für mein .Net Programm genau das druckt was ich möchte und mit den Einstellungen die der Nutzer vorgenommen hat. Es ist doch ein Unding wenn der Nutzer in dem Druckdialog unter Einstellungen Fotopapier aus dem Fach 2 wählt und es wird auf dem Fotopapier aus dem Fach zwei wie auf dem normalen Papier mit einer schlechten Qualität gedruckt. Das Fach als Einstellung wird übernommen, die Qualitätsangabe nicht.

27.04.2012 - 15:46 Uhr

Hallo herbivore,

ich habe gestern bereits nachgeschaut. Dort wird das Bild an die Druckfunktion von Windows übergeben und nicht direkt im Programm gedruckt.

Ich finde leider keine Lösung für das Verwenden der im Druckdialogs des Programms geänderten Einstellungen. Es werden nur einfache Sachen wie Anzahl der Kopien und Farbe oder S/W übernommen.

26.04.2012 - 19:20 Uhr

Ich habe noch ein Problem bzgl. Drucken mit .NET festgestellt.
Nach Aufruf des Druckdialogs und nach bearbeiten der Einstellungen werden diese nicht für den Druck nicht berücksichtigt. Manche einfache Einstellungen wie Farbe oder S/W werden richtig übernommen. Druckqualität gar nicht. Ich habe ein paar Beispielprojekte von codeproject ausprobiert. in den Projekten konnte ich das gleiche Verhalten beobachten. Mit dem Programm Paint.NET wird aber richtig gedruckt. Wahrscheinlich wurde in Paint mehr implementiert, als Standard .NET Print Klassen.

25.04.2012 - 18:26 Uhr

Gibt es eine Möglichkeit die Druckeinstellungen für ein -NET Programm zu speichern? Ich habe es mit PrinterSettings probiert, aber dort stehen anscheint nicht alle Informationen. So etwas wie Druckorientierung, Papiergröße oder Farbe/Schwarzweiß kann ich damit speichern. Die Papierqualität wird nicht gespeichert. Wenn die Papierqualität global in dem Treiber als Standard eingestellt wird, dann kann im Programm damit gedruckt werden. Aber diese Einstellung im Programm dauerhaft anders als die globale Einstellung einzustellen, habe ich nicht hinbekommen.

Vielleicht weiß jemand mehr zu dem Thema?