Dann wäre ein "reiner" Star aber besser gewesen.
Anstatt
<Grid.RowDefinitions>
<RowDefinition Height="0.25*"/>
<RowDefinition Height="0.25*"/>
<RowDefinition Height="0.25*"/>
<RowDefinition Height="0.25*"/>
</Grid.RowDefinitions>
also
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
Da die Verhältnisse ausschlaggebend sind funktioniert das genauso, aber imho ist das besser lesbar.
Ansonsten könnte man auch alles auf 100 machen (Heigth=("25*"){darkred}
), anstatt auf 1 (Heigth=("**_0._**25*"){darkred}
), was dann vermutlich die zweitbeste Variante wäre.
mfg
SeeQuark
Verwende statt Heigth=("Auto"){darkred}
einfach mal Heigth=("*"){darkred}
.
Wenn es so wie im Bild aussehen sollte, müsstest du aber noch die VerticalAligment
der einzelnen Items setzen.
Dann müsste es gehen.
Ausserdem solltest du die Bilder lieber am Anhang anhängen, anstatt mit ImageBanana o.ä. zu verlinken. Siehe [Hinweis] Wie poste ich richtig? Punkt 6.1: Bilder als Dateianhang hochladen
Aus den beiden Bildern ist ja auch schnell eines gemacht.
mfg
SeeQuark
Das ist nicht so schwer:
void minimize()
{
// Nur ein Test: Das Handle kann auch ein anderes sein
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("notepad");
IntPtr hwnd = processes[0].MainWindowHandle;
const int SW_SHOWMINIMIZED = 0x002;
ShowWindow(hwnd, SW_SHOWMINIMIZED);
}
[System.Runtime.InteropServices.DllImport("user32")]
private static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
mfg
SeeQuark
aber irgendwie kann ich dann nicht mehr auf die properties der übergeordneten klasse zugreifen.
Das brauchst du ja nicht. Oder: Das solltest du auch nicht.
Mit einer normalen Property
public List<object> Items
{
get;
set;
}
hast du alle benötigten Funktionen Insert, Remove, etc.
Mehr macht die ComboBox auch nicht.
mfg
SeeQuark
im falle von refresh stimmt es dennoch.
Laut deiner Theorie müsste folgender Code unter allen Umständen funktionieren (background wird immer erneuert):
Random r = new Random();
this.Paint += (s, e) =>
{
byte[] rgb = new byte[3];
r.NextBytes(rgb);
e.Graphics.Clear(Color.FromArgb(rgb[0], rgb[1], rgb[2]));
};
Application.Idle += (s, e) =>
{
while (true)
{
Thread.Sleep(1000);
Refresh();
}
};
Solange man die Application in Ruhe lässt zeichnet die alles schön neu.
Wenn man allerdings herumklickt kann man sie in einen Zustand bringen in dem sie nichts neu Zeichnet.
Wenn man sie dazu bringt, dass man auf den Close-Button klicken kann und dann "MyApp.exe reagiert nicht mehr" kommt, zeichnet sie nichts mehr neu.
mfg
SeeQuark
@kleines_eichhörnchen: Du hattest doch Recht 😁
[PRE]Normal: abcdefgABCDEFG1234
string.Format("{0:X}", c): abcdefgABCDEFG1234
((int)c).ToString("X"): 616263646566674142434445464731323334
c: abcdefgABCDEFG1234[/PRE]
Dann ist die Variante von pdelvo die Schnellste.
mfg
SeeQuark
was du vermutlich meinst, ist, das man zwar klicken kann aber die anwendung nicht darauf reagieren würde.
Genau. und dann stimmt
gezeichnet und angezeigt wird trotzdem
nicht mehr 😉
Jedenfalls unter Vista.
mfg
SeeQuark
@kleines_eichhörnchen: Diese Methode ist doch äquivalent zu ((int)c).ToString("X")
(oder täusche ich mich?). Das dürfte ja etwas anderes sein als ein einzelner Char.
Vermutlich kannst du mehr an der Apprend-Methode herausholen, indem zu bspw. die Länge weisst und alles mit einem Char-Array machst, das du dann in einen string konvertierst.
mfg
SeeQuark
Du solltest es schon auf einen neuen Thread auslagern: [FAQ] Warum blockiert mein GUI?.
@pdelvo: Auch wenn du nur die Funktionen erläutert hast, bei einem blockiertem Gui nützt das wenig.
Selbst wenn das Refresh manchmal funktioniert, kann die Anwendung bei einem Klick oder Ahnlichem kurzzeitig abstürzen.
Zu den Threads: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke) und [Artikel] Multi-Threaded Programmierung
mfg
SeeQuark
Eigentlich müsste [FAQ] Eigenen Event definieren / Information zu Events ausreichen.
Ansonsten kannst du die Sachen im 🛈 / 📗 und ev. :rtfm: nachschauen.
mfg
SeeQuark
Möglich wäre zwar auch, über Control["TextBox" + i] zuzugreifen, zu empfehlen ist das aber nicht.
nicht wirklich, da der varibalenname nichts mit dem namen des controls zu tun haben muss.
Da man, wenn man die Controls manuell codet, 81 Variablen anlegt, ist unwahrscheinlich.
Und der Designer macht das automatisch. daher würde das gehen.
Ausserdem wäre ein TextBox[,] imho besser geeignet als eine List<T>.
Dennoch: Mach dir entweder ein eigenes Control oder verwende das DataGridView (wie in Codeproject.
mfg
SeeQuark
Ich habe nun 81 Textboxen (TextBox1, TextBox2,...)
8o
Das empfiehlt sich so nicht: Besser wäre [FAQ] Variablennamen zur Laufzeit zusammensetzen.
Möglich wäre zwar auch, über Control["TextBox" + i] zuzugreifen, zu empfehlen ist das aber nicht.
Ausserdem stellt sich die Frage, ob es überhaupt gut ist, so viele TextBoxen zu haben. Das kann sich negativ auf die Performanz auswirken.
Besser wäre ein eigenes (einzelnes) SudokuControl, welches alle Eingaben annimmt.
Das ist imho auch viel einfacher zu bedienen als nach jeder Zahleingabe Tab zu drücken.
mfg
SeeQuark
Ein x:Shared=(&quot;False&quot;){darkred}
bei den Resoucen sollte das Problem lösen.
Und für XAML eignet sich das [****XML]-Tag besser als das [****CSHARP]-Tag.
mfg
SeeQuark
Aufgabe einen Compiler mittels c# zu erstellen.
Du willst einen Compiler erstellen? Als Beginner? Oder hast du dich nur falsch ausgdrückt?
Falls du wirklich einen Compiler bauen willst, kann ich dir den Webcast Ein neuer Compiler in einer Stunde sehr empfehlen.
1.Gibt es irgendwo einen Quellcode für c#, dass den Datei-öffnen-Dialog ersetzt?
Auch das habe ich nicht verstanden. Möchtest du den OpenFileDialog
nachgebaut haben? Dann würde ich z.Bsp. in Codeprojekt nachschauen.
- Kann ich mit einer Stringfunktion ganze Wörter eines Strings ersetzen.
Dazu gibt es RegEx ([Artikel] Regex-Tutorial). Damit sollte das kein Problem sein.
EDIT: Die String-Funktionen können doch auch string
s ersetzen.
- Kann ich an c# eine Tabelle bzw. eine andere Datenbank anhängen und diese dann als Quell-bzw Ersetzwerte verwenden?
Wenn ja wie?
Du hast da viele Funktionen. Das einfachste wäre ein Dictionary<,>, eine richtige Datenbank wäre dann SQL. Gehen tut alles, du solltest das etwas eingrenzen.
Bitte beachte auch noch [Hinweis] Wie poste ich richtig? Punkt 1.2 Nur ein Thema pro Thread.
mfg
SeeQuark
Leider wird nichts angezeigt.
Angenommen dein ObservableDictionary funktioniert.
Hast du das in ItemTemplate definiert (inkl. DataTemplate)?
Und warum verwendest du ein ContentControl? Wenn du das nicht noch auswechselst, solltest du es ersetzen.
PS:
[FONT][COLOR]if[/COLOR] (dialog.ShowDialog() == [COLOR]true[/COLOR])[/FONT]
:::{style="color: royalblue;"}[Tipp] Anfängerfehler == true / == false){royalblue} :evil:){gray}
mfg
SeeQuark
Zeichne auf eine WritableBitmap und zeige diese mit einer ImageSource (in dem in XAML definierten DefaultStyle) an.
Dann brauchst du das OnRender nicht zu überschreiben und er sollte eigentlich bei jeder Änderung am Bitmap automatisch das Layout updaten.
mfg
SeeQuark
sortieren ist sehr teuer in diesem fall.
Mit 2 Listen fällt mir nichts besseres ein.
Vielleicht ein eigenes Sort-Verfahren, welches die Elemente noch zusätzlich einfügt, wenn das überhaupt schneller sein sollte.
mfg
SeeQuark
Gibt es Alternativen?
WPF. Dann hast du auch die schönen Animationen der TextBox, welche selbstständig nicht besonders leicht nachzuproggen sind.
Da WPF vektororientiert ist, wird es immer scharf gezeichnet.
Obwohl du die CheckBox auch in WinForms einbinden kannst (ElementHost-Control), wäre bei dieser Variante vermutlich ein kompletter Umstieg einfacher.
Die Einarbeitung in WPF ist allerdings relativ schwer, ob sich das lohnt, musst du abschätzen.
<Grid>
<Grid.LayoutTransform>
<ScaleTransform ScaleX="2" ScaleY="2"/>
</Grid.LayoutTransform>
<CheckBox>hallo</CheckBox>
</Grid>
Der Vorteil ist, dass du dich abgesehen von der LayoutTransform nicht mehr um die anderen Sachen kümmern musst, da auch Buttons, Texte und der Rest nicht mehr manuel vergrössert werden müssen.
Wenn du alles andere schon erledigt hast, würde ich dir aber zu der WinForms Variante raten, oder es dennoch hosten.
mfg
SeeQuark
Muss es eine List<>
sein?
Am einfachsten wäre imho, Liste 1 erst zu sortieren, dann kannst du die weiteren Elemente ohne Probleme in die neue Liste einfügen.
// Vorthandene List
List<string> list1 = new List<string>(new[] { "1", "4", "2", "1", "3" });
list1.Sort(); // Sortieren
// neue Liste anlegen
List<string> list2 = new List<string>(list1.Capacity);
string last = null; // letzes current
foreach (string current in list1)
if (last != current)
list2.Add(last = current); // Etwas CodingStyleHorror, aber halt kurz
// Grösse minimieren
list2.TrimExcess();
mfg
SeeQuark
Aber ich frage mich wo der Vortiel gegenüber dem C#-Quellcode [...] ist.
Ich muss ja in jedem Falle eine Zeile C#-Quellcode schreiben.
Ich frage mich auch, ob ich das DataContext der listBox nehme, oder die des Window? Ein Unterschied ist zur Zeit nicht zu sehen. Beides funktioniert!
Ich verwende meistens den DataContext der Form, da so die ListBox anonym bleiben kann. Ausserdem ist dann der Zugriff aus dem C#-Code etwas bequemer.
Sobald aber mehrere DataContext's zur Verfügung stehen müssen, kannst du nicht ausschliesselich den des Windows nehmen.
[kann] ich zum Beispiel auch statt der TextBox für jedes Element in der ListBox wieder eine ListBox nehmen [...]?
Dann zum Beispiel das Databinding jeder ListBox der ListBox eine Klasse setze, die Daten (Vorname, Nachname, etc) zu jedem Namen verwaltet.
Nehmen kannst du sicher eine ListBox, das ist ja gerade das tolle an WPF.
Ich gehe aber nicht davon aus, dass es viel bringt. Dazu verwendest du lieber die gleiche ListBox, halt mit mehreren Headern. Oder gleich das DataGrid aus dem WPF-Toolkit.
mfg
SeeQuark
Hallo
Siehe auch: MemoryLeaks / nicht abgehängte Events
Es kommt drauf an, wer die Events registriert hat.
mfg
SeeQuark
this.Dispatcher.BeginInvoke(new Action(() => myObservableCollection.RemoveAt(0)));
Siehe [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)
Obwohl die FAQ für WinForms ist, ist sie eigentlich deckungsgleich mit WPF, der einzige Unterschied wird ganz unten erläutert.
EDIT: Wo ist denn da das MVVM Problem?
mfg
SeeQuark
Hallo
Das ganze sollte am besten über Threads funktionieren oder?
Genau. Ansonsten blockiert dein GUI ([FAQ] Warum blockiert mein GUI?) Also: Neuen Thread mit der Aufgabe starten und bei Bedarf der ProgressBar den Fortschritt mitteilen.
In das Threading kannst du mit [Artikel] Multi-Threaded Programmierung einsteigen.
Die Probleme die du dann hast sind dann [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke).
Wie kann ich allerdings abrufen, ob frmFuel schon fertig ist bzw. schon angezeigt wird?
Am besten mit Events. Dazu siehe [FAQ] Eigenen Event definieren / Information zu Events bzw. [FAQ] Kommunikation von 2 Forms
Ich bin auf frmMain und will frmFuel öffnen.
In C# sollte man eigentlich keine ungarische Notation verwenden (Namenskonventionen: Ungarische Notation im GUIs ok? Antwort: Nein).
Noch was: Code am Besten mit den [****CSHARP]-Tags, siehe [Hinweis] Wie poste ich richtig?
Ich hoffe, das waren nicht zu viele Links, aber dann hast du zumindest genug Lektüre und merkst vielleicht, wie oft solche Sachen schon diskutiert worden sind.
mfg
SeeQuark
Das markieren an sich sollte ja kein Problem darstellen.
Eig. besteht das nur aus dem Cursor setzen, den Bereichn blau übermalen und ev. noch Funktionalitäten wie Copy/Paste/Cut zur Verfügung zu stellen.
Außerdem könnte man da unter Umständen schnell an die Grenzen der verfügbaren Window-Handles geraten Das eigentliche Problem sollte aber eher die Performanz darstellen, sogar noch mehr wie deine Handles (habs noch nie ausprobiert).
Das einfachste wäre zum Beispiel, ein komplett neues Control zu entwickeln.
Die Überlegungen siehst du schön in Control(s) á la Word
normale Textverarbeitungprogramme zeichnen Text und Bilder selbst. Selbst wenn es zuerst einfacher klingt, fertige Controls zu verwenden, wird sich das m.E. relativ schnell rächen.
Andererseits, wenn dir das Browser-Control nicht passt, könntest du auch die (für managed gemachte) Variante des FF (Gecko) nehmen oder das Chromium-Projekt managed machen, etc.
mfg
SeeQuark
Hallo herbivore
das ist doch eher ein best practice Beispiel. [...] Und dann schlägt die mit dem zweien ToUpper eingezogene Sicherheitsebene zu.
Als best practice würde ich das noch nicht bezeichnen.
Ich hätte da die Methode s.StartsWith("abc", true, null)
vorgezogen.
Als Coding Style Horror würde ich die ToUpper's auch nicht abstempeln, da sie imho etwas übersichtlicher sind, aber best practice finde ich übertrieben.
mfg
SeeQuark
Du hast mehrere Möglichkeiten. Die einfachste ist imho, ItemsSource=("{Binding}"){darkred}
zu verwenden.
Dann must du dem DataContext deines Windows (oder dem nächsten übergeordneten Element mit DataContext) eigentlich nur noch als DataSource eine ObservableCollection<MyComplexDataType>
zuweisen.
Noch besser wäre, die verschiedenen Properties je nach Spalte anzeigen zu lassen.
Alles wird in diesem WebCast schön erklärt: WPF: SP1 und das WPF-Toolkit (Teil 1 von 6) - Was gibt's Neues?.
mfg
SeeQuark
Versuchs doch einfach. Imho ist das möglich.
Die Line
-Property ist nämlich eine Dependency-Property (laut MSDN). Dann sollte das auch möglich sein.
Nur ob's sinnvoll ist, das ist die andere Frage...
Wofür brauchst du das denn?
mfg
SeeQuark
Vorteile sind z.B. die Möglichkeit der Deinstallation, allgemein gekannte Oberflächen, ...
Ich sehe das nicht so. Es gibt viele Programme, die eigene Installer haben, wie bspw. Visual Studio, Office oder GeoGebra (es gibt sicher noch viel mehr).
Solange sie ähnlich in der Bedienung sind wie der MSI, finde ich es sogar eher positiv, da sie dann meist eine etwas schönere Oberfläche besitzen.
Und einen Deinstaller haben sie alle auch.
Nur ist die Frage, ob sich der Mehraufwand lohnt.
mfg
SeeQuark
Schau mal in diesen Namespace: http://msdn.microsoft.com/de-de/library/system.configuration.install.aspx.
Möchtest du wirklich einen schönen eigenen Installer proggen oder den Standard Windows Installer verwenden?
mfg
SeeQuark
Hallo!
Einen eigenen Event erstellen hat den Vorteil, dass man die benötigten Daten in einem EventArgs
weiterleiten kann.
Die "Richtlinien" für Events, oder besser: wie man sie am Besten macht, stehen in [FAQ] Eigenen Event definieren / Information zu Events.
Daran sollte man sich am Besten halten und dann spart man sich auch den void ABCHandler(char chosenChar);
und verwendet den dafür vorgesehenen EventHandler<MyEventArgs>
(hat MaXeM aber auch schon gesagt).
mfg
SeeQuark
List<KeyValuePair<int, string>> Src=new List<KeyValuePair<int, string>> (); //befüllen //... //binden comboBox1.DisplayMember="Value"; comboBox1.ValueMember="Key"; comboBox1.DataSource = Src; //... //typisierter Zugriff: string selectedValue = Src[comboBox1.SelectedIndex].Value;
Analog dazu zu einer ListBox.
mfg
SeeQuark
Es fängt Windowsnachrichen ab 😁
Schau sonst mal in den verlinkten Thread rein.
Da steht bspw:
See Sharp :::
🤔 Ev. hat er es verwechselt mit dem eigentlichen Thema. Das mit den Windowsnachrichten stimmt aber.
Die Windowsnachrichten kommen vom Betriebssystem.
Und sie können wegen dem "ref" verändert werden.
Die einzelnen, von mir benötigten Parameter sind:*The WM_NCHITTEST message is sent to a window when the cursor moves, or when a mouse button is pressed or released. If the mouse is not captured, the message is sent to the window beneath the cursor. Otherwise, the message is sent to the window that has captured the mouse. *HTCLIENT: In a client area. *HTCAPTION: In a title bar.
(Quelle: www.pinvoke.net)
Wenn du also auf das Fenster klickst, wird ein Klick auf die "Title Bar" simuliert.
Weiterführend kann ich den [Artikel] Custom Window Border für Form's empfehlen.
Im Grunde genommen kommt das auf das Gleiche heraus (Windowsnachrichten empfangen und modifizieren).
mfg
SeeQuark
Sicher geht das. Du kannst das entweder selber machen mit MouseClick und so (sehr fehleranfällig) oder die Windowsnachricht überschreiben.
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
const int WM_NCHITTEST = 0x84,
HTCLIENT = 0x01,
HTCAPTION = 0x02;
if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT)
m.Result = (IntPtr)HTCAPTION;
}
Müsste so klappen (habs aus dem Post von mir kopiert).
mfg
SeeQuark
@JAck30lena: In WPF geht das nicht so einfach mit Drawing-Brushes.
Ich moechte ein quadrat
Muss es eines sein?
Du kannst das ja auch mit mehreren zusammenstellen.
mfg
SeeQuark
Könntest du deinProblem etwas genauer beschreiben?
einfadende Toolbar
Einfahrende ToolBar?
Wenn ja, geht es weiter: 1. Den "EinfahrButton" oder 2. das "EinfahrGestell"?
ad 1: Da verwende ich ein vertikales TabControl
ad 2: Siehe RenderTransform. Wenn es dann entgültig gepinnt worden ist, solltest du es allerdings entgültig festpinnen.
Vielleicht noch interessant, damit du nicht alles selber machen musst ist die DockPanel Suite.
mfg
SeeQuark
Imho musst du dazu ein einfaches Item Template (ControlTemplate) schreiben.
Dann kannst du den ToolTip überschreiben und einen ImageViewer reinetzen.
mfg
SeeQuark
Den Cast kannst du mit legalisieren wenn du einen operator dafür schreibst.
Aus dem Kopf etwa so:
public static explicit operator CustomClientSocket(Socket s) {
return s as CustomClientSocket; // oder wie die Umwandlung auch immer verlaufen soll
}
Einen eigenen Konstruktor dafür wäre zwar auch denkbar, aber du wolltest es ja so haben.
Wenn du aus dem explicit
ein implicit
machst, brauchst du das "(CustomClientSocket)
" gar nicht mehr angeben.
Imho solltest du den impliziten cast aber nur verwenden, wenn die Umwandlung ohne iIformationsverlust zu und hergeht.
mfg
SeeQuark
Visual Studio 2005 kann man mindestens "nachrüsten".
Aber Visual Studio 2003 imho nicht...
Warum möchtest du inbedingt Visual Studio 2003 dazu verwenden?
Ev. kannst du nebenbei die VS08 EE verwenden.
Ideal ist das natürlich nicht.
Möglich ist WPF übrigens auch erst ab Windows XP.
Die Lektüre Anwendung = Code + Markup wollte ich auch erst kaufen, aber bei den Amazonbewertungen ist sie relativ schlecht abgeschnitten.
mfg
SeeQuark
Ich kann das zwar nicht erklären, aber ohne dein HorizontalScrollBarVisibility=("Hidden"){darkred}
sollte es funktionieren.
mfg
SeeQuark
- das "eine" und "alle" vom einleitenden Satz ist generell überdenkungs würdig.
Ich finde das generell nicht besonders gut.
Manchmal kann es schon Sinn machen, eigene Exceptions zu schreiben aber ich finde, wenn schon Exceptions, bspw. um eine Verbindung zu öffnen schon vorhanden sind sollte man auch diese verwenden.
Wenn wirklich ein eigener Exceptionstyp gebraucht wird, könnte man erwägen diesen zu schreiben.
@steven: Da diese Sachen sowieso meistens IDisposable implementieren könntest du sie einfach mit using umschliessen.
Dispose bzw. Close wird dann auf jeden Fall aufgerufen, egal ob eine Exception geworfen wurde oder nicht.
Die Exception wird dagegen weitergeleitet.
Siehe dazu Dispose implementieren und verwenden
mfg
SeeQuark
Geht aber nicht. Zeigt nichts an. Warum nicht? Was fehlt?
Geht die MessageBox überhaupt auf?
Wenn nein, solltest du den Event noch einmal im Designer (oder, falls du den nicht verwendest von Hand) registrieren.
Also von Hand etwa so (ungetestet):
TabControl1.Selecting += TabControl1_Selecting;
Im Designer musst du bei den Events (gelber Blitz) unter dem Selecting-Event deine Methode auswählen.
He, du verwendest ja das Beispiel aus der MSDN
Da steht das in folgendem Satz:
Stellen Sie anschließend sicher, dass der Ereignishandler dem Selecting-Ereignis zugeordnet ist.
mfg
SeeQuark
Hallo.
Wenn du den gesamten string auf bestimmte Buchstaben überprüfen willst, solltest du das Pattern mit ^$
umschliessen.
Bezüglich der Syntax von RegEx kann ich dir das [Artikel] Regex-Tutorial empfehlen.
Zum Testen empfiehlit sich das On-the-fly Regex-Tester: Regex-Lab.
Das vereinfacht die Arbeit mit RegEx extrem.
mfg
SeeQuark
Andere Lösungsansätze:
Du kannst entweder das Resize-Event der Form dazu verwenden die Steuerelemente "von Hand" zu resizen oder du steckst den Button in ein TableLayoutPanel
.
Wenn du aussenrum je eine Zelle mit einer relativen Breitenangabe und in der Mitte eine mit einer absoluten Breitenangabe machst, sollte das Ziel auch erreicht sein.
mfg
SeeQuark
Du kannst den ListView in einen Grid stecken und mit dem GridSplitter
die Grösse der "Zelle" zu ändern.
mfg
SeeQuark
Ich würde in solchen Sachenn immer erst googeln und in Codproject nachschauen.
Meinst du so was in der Art (in den Links versteckt)?
mfg
SeeQuark
Wie kann man eigentlich direkt auf einen Beitrag verlinken ?
Kam von herbivore hier mal als Vorschlag: Beitrag verlinken
Du musst beim
Heute, 19:08
einfach auf das Bild klicken.
(Ich habs bis vor kurzem noch mit der Baumstrukturanzeige gemacht)
mfg
SeeQuark
Meinst du so was wie im Screenshooter V2T?
Da ist der SourceCode dabei, aber reines Copy'n'Paste kannst du auch hier nicht machen.
mfg
SeeQuark
Hallo tonka
Sicher reicht das!
Hier etwas Code:
public partial class DialogForm : Form
{
public DialogForm()
{
// Eigene Einstellungen
this.Text = "Test Form (Sollte bei ESC beenden)";
this.Padding = new Padding(10);
// TextBox initialisieren
this.Controls.Add(new TextBox
{
Dock= DockStyle.Fill,
Multiline=true,
TabIndex=0,
Name="FocusKlauTextBox"
});
// KeyPreview: Schnappt sich alle KeyDown-Events als erstes
this.KeyPreview = true;
this.KeyDown += (s, e) =>
{
if (e.KeyCode == Keys.Escape)
this.Close();
};
}
}
Und das funktioniert.
Dafür ist KeyPreview
ja gerade da, dass man das nicht mit allen Controls machen muss.
Das Problem ist sonst, das wenn der Focus z.B. auf einer Textbox liegt, nur das keydown-event der textbox gefeuert wird, und nicht die des Forms. Wie du an meinem Gegenbeispiel siehst, wird das durch die
KeyPreview
beseitigt =).
mfg
SeeQuark
Nicht direkt...
Aber mit KeyPreview = true
alle Tastaturanschläge abfangen und falls Esc die Form schliessen.
Geht halt nicht nur rein im Designer.
mfg
SeeQuark
Wie kann man die Aktuellen Koordinaten des Panels abfragen
Entweder hast du das noch nicht ganz verstanden, was du kopiert hast oder nur etwas unglücklich formuliert:
Dein Panel hat immer noch die gleichen Koordinaten wie vorher.
Die :rtfm: MSDN sagt zur [Rendertransform](http://msdn.microsoft.com/de-de/library/system.windows.uielement.rendertransform.aspx)
:
Bei einer Rendertransformation wird keine Layoutgröße erneut generiert, und es werden keine Größeninformationen gerendert. Rendertransformationen sind i. d. R. zum Anwenden von Animationen oder eines temporären Effekts auf ein Element bestimmt.
Also solltest du bei beenden der Animation ([Completed-Event](http://msdn.microsoft.com/de-de/library/system.windows.media.animation.timeline.completed.aspx)
) die entgültige Variable setzen.
Zu deiner Frage:
Direkt zugreifen kannst du mit
(this.ausfahren.RenderTransform as TranslateTransform).X
Die Frage ist, was es dir nützt.
Eine "IsAnimated-Property" existiert imho nicht. Die Möglichkeit die du möchtest wäre, auf den Wert der RenderTransform
zuzugreifen, eine andere einen bool
schen Flag zu setzen.
Warum willst du eigentlich zwischen aus- und einfahren unterscheiden?
M.E. ist das doch belanglos, weil der einzige Ort, in dem du das wissen musst ist am Ende der Animation ist.
Und was da passiert, weist du sowieso beim definieren der Animation
zu.
mfg
SeeQuark