Laden...

Forenbeiträge von JonnyJohnson Ingesamt 17 Beiträge

07.09.2012 - 08:30 Uhr

Also das grundlegende klappt ja. Ich habe Bilder und lege diese übereinander. Das Problem ist das zeichnen, wie genau kommt der Bildinhalt auf die Oberfläche?

06.09.2012 - 16:02 Uhr

Ich versuche ihn seit einer Stunde zu verstehen, aber der wesentliche Punkt wie genau man nun zeichnet, kommt da nicht wirklich durch.

06.09.2012 - 14:50 Uhr

WIe genau bekomme ich sie denn auf das Control?

Ich lege mit g = new Graphics(); meie Malfläche an, dann zeichne ich mit
g.DrawImage(bild1, 0, 0);
g.DrawImage(bild2, xpos, ypos, (int)Math.Round(bild2.Width/scaling), (int)Math.Round(bild2.Height/scaling));
meine beiden Bilder, wie vorher auch schon. Nur was dann?
Wie bekomm ich den Inhalt von g in meine Imagebox?

06.09.2012 - 14:21 Uhr

Hallöle,

ich habe 2 Bilder, die ich einlese:

var bild1 = Image.FromFile(file1.Text);

file1.Text ist dabei der Pfad und das ganze sieht bei einem 2. Bild fast genau so aus. Nun möchte ich die beiden Bilder so überlagern, dass bild1 als Hintergrund dient und bild2 an einer gewünschten Position davor gelegt wird.

Zb man wählt beide Bilder aus, wählt unten rechts an, dann ist bild1 in der Originalgröße, bild2 wird skaliert und an die gewählte Position verfrachtet.
Prinzipiell klappt das ganze auch schon, allerdings nur mit Speichern des Bildes:


var bild1 = Image.FromFile(file1.Text);
var bild2 = Image.FromFile(file2.Text);

var g = Graphics.FromImage(bild1); 
g.DrawImage(bild2, new Rectangle(xpos, ypos, (int)Math.Round(bild2.Width/scaling), (int)Math.Round(bild2.Height/scaling)), 0, 0, bild2.Width, bild2.Height, GraphicsUnit.Pixel, iaPic); //iaPic für Transparenz
g.Dispose();

bild1.Save("temp.png");
var b = new ImageSourceConverter();
ar bild = b.ConvertFromString("temp.png");

image3.Source = (ImageSource) bild;

xpos und ypos sind die Koordianten, wo der (0,0)-Punkt von bild2 liegen soll (klappt auch, scaling ist ein Faktor, der bild2 skaliert.
g legt also das 2. Bild in ein Rechteckt mit gewünschter Größe an die gewünschte Position auf den hintergrund bild1. Das Ergebnis wird dann in der GUI in der Imagebox image3 angezeigt.

Das Problem: Das ganze geht nur ein mal. Danach existiert temp.png schon und wird auch von einem Thread noch verwendet. Es lässt sich nicht überschreiben und auch nicht löschen. Deshalb wollte ich das ganze anders verwalten, also ganz ohne festes Speichern des Bildes. Meist führt das aber dazu, dass man keine ImageSource mehr daraus bekommt und auch keine anzeige.

Am Ende soll es so sein, dass man die 2 Bilder auswählt, per DropDown die Position anwählt und mit nem Slider den Wert von scaling ändern kann. Das Ergebnis soll dann "live" als weiteres Bild in der GUI erschreinen.

Ik hoff ma da kann mir hier wer helfen 😉

MfG

06.09.2012 - 12:07 Uhr

Hey ho,

habe es nun per XAML gelöst. Dort die Spalten explizit vorgegeben und an die Member der Daten gebunden. Spart man sich ein bisschen Code 😉
Aber danke für die anderen Vorschläge.

05.09.2012 - 12:02 Uhr

Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
Parametername: index

Das Problem ist ja, dass der verwendete Datentyp scheinbar keine Columns einträgt.
.Columns ist zum Beispiel mit 0 angegeben

05.09.2012 - 10:29 Uhr

Wenn ich über den Index zugreife, bietet fehlt leider die Eigenschaft .Visibilty oder ähnliches...

05.09.2012 - 09:34 Uhr

Hallo,

ich habe ein DataGrid in welchem ich Spalten ausblenden möchte. MSDN und alle anderen Seite machen den Vorschlag mit

dataGrid.Columns["name"].Visibility=Visibility.Hidden

So schön, so gut, nur mein DataGrid hat keine "Namen" bei den Spalten. Im Debugger selbst wird .Columns als null angegeben, es sind aber Datan vorhanden.
Die Alternative wäre, dass man gezielt die Einträge umspeichert, da scheitert es dann aber an der Formatierung (es wird eine lange Liste, soll aber eine Tabelle zum anschaun werden, 8 Zeilen, 6 Spalten) und mehrdimensionale Zuweisungen an das DataGrid gehen ja irgendwie auch nicht...
Wie geht man da am besten vor?

31.08.2012 - 09:12 Uhr

So, nun gehts. 😃
Mit


IsOverlayEnabled="{Binding Path=Overlay, Mode=TwoWay}" Name="MainOverlay"

und nach der Instanziierung durch


MainOverlay.DataContext = _myOverlay;

liest er alles richtig aus und das Overlay reagiert, wie es soll 😃

Danke.

30.08.2012 - 16:42 Uhr

Oh, das hatte ich falshc zusammenkopiert.
Ich binde mit IsOverlayEnabled="{Binding _myOverlay.Overlay, Mode=TwoWay}" und auch in der Ausgabe kommt kein Fehler...

30.08.2012 - 16:20 Uhr

Gut, versuchen wirs mal so:

Ich habe in der XAML-Datei als erstes Element (nach dem xlms:-Definitionen) folgendes:

<LoadingSection IsOverlayEnabled="{Binding myclass.Overlay, Mode=TwoWay}" Name="MainOverlay"> (LaodingSection ist dabei ein CustomControl, was bei IsOverlayEnabled = true das Parent überdeckt, bei Bedarf Buttons und eine Fortschrittsanzeige darstellt).
Die Eigenschaft IsOverlayEnabled kann hierbei true oder false sein. Der zugehörige bool-Wert soll ein public-Property sein, der Rest private.

Im Codebehind habe ich die Klasse


public class MyClass : INotifyPropertyChanged
        {
            private bool _overlay;
            public event PropertyChangedEventHandler PropertyChanged;

            public bool Overlay
            {
                get { return _overlay; }
                set
                { 
                _overlay = value;
                OnChanged("Overlay");
                }
            }
            public void OnChanged(string propertyName)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

Welche ich per

private MyClass _myOverlay = new MyClass(); 

zu Beginn instanziiere. Klickt der Benutzer nun auf einen Button, soll die Eigenschaft IsOverlayEnabled auf true gesetzt werden für ein paar Sekunden und nach Ablauf eines Timers wieder auf false. Daher das Binding.

Nun sollte ja (den Erwartungen nach) ein Event auftreten, wenn ich _myOverlay.Overlay ändere, richtig? Durch das Binding sollte dann auch eigentlich IsOverlayEnabled davon Wind bekommen und entsprechend reagieren, tuts aber nicht.

Man könnte sicherlich alles deaktivieren, aber es ist gedacht da auch noch weitere Dinge hinzuzufügen, wobei sich eben die LoadingSection am besten dabei macht. 😕 Da ohne weitere Einstellung bei der LoadingSection sich auch noch was bewegt, entsteht der Eindruckt der abgeschmierten Anwendung eben auch nicht. 😃

30.08.2012 - 14:41 Uhr

Welchen Teil möchtest du denn haben?

30.08.2012 - 13:14 Uhr

Habs hinzugefügt, weil Editieren nicht möglich war.

IsOverlayEnabled ist die Eigenschaften eines Ladebildschirms, steht das auf "true" überdeckt es das ganze Window (oder Control, je nach dem). Diese Einstellung ist anfangs auf "false" gesetzt. Bei einem Buttonklick soll eine Anfrage per Backfgroundworker gestartet werden. Während der Anfrage soll die GUI gesperrt sein (IsOverlayEnabled sol true werden), jedoch entsteht durch das Überblendmodul nicht der Eindruck, dass alles abgeschmiert wäre, falls der Backgroundworker lange auf Daten warten muss.
Daher soll die Eigenschaft IsOverlayEnabled an ein bool im Code gebunden werden, welcher public gesetzt werden kann. Baut man das ganze also ein, setzt man nur an einer Stelle diesen bool auf true und der Rest passiert von alleine.
Das soll durch das Binding passieren, was bei mir aber nicht hinhaut, da die EIgenschaft IsOVerlayEnabled nicht darauf reagiert.

"bla" ist die Instanz der Klasse "MyClass", über die der bool-Wert gesetzt werden soll.
"LoadingScreenOverlayEnable" ist nur ein weiterer bool-Wert zum Testen, da es bis jetzt mit der PropertyChanged-Variante nicht klappt. Hiermit klappts aber genau so wenig.

Ich hoffe das ganze ist nun etwas klarer.

30.08.2012 - 12:34 Uhr

TwoWay hilft leider nicht 😦

30.08.2012 - 10:34 Uhr
public class MyClass : INotifyPropertyChanged

ist dabei wie oben aufgebaut.

30.08.2012 - 09:00 Uhr

Erst mal Danke für die ersten Vorschläge.
Ich bin ja auch noch ganz am Anfang 😉 von daher ist das MVVM noch nicht ganz umgesetzt.
Ich hab allerdings nach wie vor das Problem, dass sich die Property vom XAML Bauteil nicht mitändert. Habe eine INstanz der Klasse erzeugt

public MyClass bla = new MyClass();

und ändere an gegebener Stelle den Wert

bla.Overlay = true;

aber trotzdem passiert nichts.

In der Baumstruktur im Debugger steht bei PropertyChanged stets

null

.

Das Binding versucht mit

IsOverlayEnabled="{Binding LoadingScreenOverlayEnable}"

oder mit weiteren Pfadangaben zur Instanz oder mit Projektname. Beim Debuggen wird der Wert im Designer (mit der Maus über die Bindingzuweisung fahren) auch richtig angezeigt, nur die Wirkung der Zuweisung (IsOverlayEnabled steht im Debugger unweigerlich auf

false

) zeigt sich nicht.

29.08.2012 - 08:55 Uhr

Hallo,

ich schlage mich mit einer (sicher dämlichen) Frage rum:
Ich habe ein Overlay in WPF und das hat eine Eigenschaft IsOverlayEnabled. Setzt man dieses auf true, überblendet es die ganze momentane Anzeige. Nun soll die Eigenschaft aber einen boolschen Wert gebunden werden, der sich im Code ändert.
Habe da schon einiges versucht, allerdings reagiert das Element nicht auf die Änderung und ich weiß nicht wieso.

IsOverlayEnabled="{Binding Path=IsOverlay}" oder IsOverlayEnabled="{Binding IsOverlay}" bewirken da nichts.
Auf ner anderen Seite hab ich gelesen, dass man evtl. noch dieses IPropertyChanged einbauen müsste, ist das vllt der springende Punkt?

MfG