Laden...
Avatar #avatar-2541.jpg
Sutix myCSharp.de - Member
Programmierung Georgsmarienhütte Dabei seit 18.05.2006 83 Beiträge
Benutzerbeschreibung

Forenbeiträge von Sutix Ingesamt 83 Beiträge

16.09.2009 - 17:34 Uhr

Ja, das sind wirklich alle Fehler die ich bekomme. Ich verstehe es auch absolut nicht. Ja, es ist von Dispatchable geerbt, also sollte es da eigentlich kein Problem geben. Einen versteckten Fehler kann ich nicht ausschließen, aber es ist unwahrscheinlich, da diese Fehler erst auftreten, seitdem ich die Klassen Dispatchable und CollectScreenDispatcher erstellt und in den Konstruktor hinzugefügt habe 😦

Ich bin absolut ratlos.

16.09.2009 - 17:19 Uhr

Warnung 1 Der Designer konnte für diese Datei nicht angezeigt werden, da keine der enthaltenen Klassen definiert werden kann. Der Designer hat folgende Klassen in der Datei überprüft: WizIntro -- Die SystemAnalysator.Klassen.Mainclasses.BscUserControl-Basisklasse konnte nicht geladen werden. Stellen Sie sicher, dass auf die Assembly verwiesen wurde und alle Projekte erstellt wurden.

Fehler 2 Die beste Übereinstimmung für die überladene SystemAnalysator.Klassen.BscForm.WizIntro.WizIntro(ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable)-Methode hat einige ungültige Argumente. ***r\Klassen\BscForm\WizzardForm.cs

Fehler 3 1-Argument: kann nicht von "ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.CollectScreenDispatcher" in "ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable" konvertiert werden.

Ich kann keine Instanz der Klasse WizIntro erstellen, da er nicht von CollectScreenDispatcher zu Dispatchable konvertieren kann.

16.09.2009 - 16:59 Uhr

Hi ehrlichgesagt verstehe ich es auch nicht. Und ich ging auch nicht davon aus, dass es nicht klappt. Deshalb bin ich auch nicht grad gut gelaunt. Den parameterlosen Konstruktor habe ich schon eine ganze Weile drin, das ändert aber gar nichts an der Sache. Nochmal alle involvierten Klassen:

Das ref bezieht sich nicht auf base, was auch sinnlos wäre, da es davon nie eine Instanz gibt, es bezieht sich auf die Klasse, die das Objekt beinhaltet. Aber der Grund, WIESO ich ref benutze ist auch völlig irrelevant. Es soll einfach eine direkte Beziehung zur Klasse herstellen, die den Dispatcher beinhaltet. Es gibt eventuell andere gute Lösungen dafür, aber in c++ würde ich einen pointer übergeben.

Nochmal: Das Objekt, dass per ref übergeben wird ist eine ganz andere Klasse als die, bei der es im Konstruktor übergeben wird!

Problemform


namespace SystemAnalysator.Klassen.BscForm
{
public partial class WizIntro : SystemAnalysator.Klassen.Mainclasses.BscUserControl
{
public WizIntro()
{
InitializeComponent();
}

public WizIntro(ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable MyParentDispatcher)
: base(ref MyParentDispatcher)
{
InitializeComponent();
}
}
}


Dispatchklassen


namespace SystemAnalysator.Klassen.Mainclasses.DispatchAbles
{
public abstract class Dispatchable
{
[... Unwichtig ...]
}
}

namespace SystemAnalysator.Klassen.Mainclasses.DispatchAbles
{
class CollectScreenDispatcher : Dispatchable
{
[... Auch nichts wichtiges bisher...]

}
}

Basisklasse meiner Usercontrols


namespace SystemAnalysator.Klassen.Mainclasses
{
public struct paintObj
{
public Image ctrImage;
public int ctrLeft;
public int ctrTop;
}

public class BscUserControl : System.Windows.Forms.UserControl
{

[System.Runtime.InteropServices.DllImport("gdi32.dll";)]
public static extern long BitBlt(IntPtr hdcDest, int xDest, int yDest, int width, int height, IntPtr hdcSrc, int xSrc, int ySrc, int dwRop);

public paintObj[] paintObjects;

Bitmap testmap;
private bool _isDisabled = false;
public bool isDisabled
{
private DispatchAbles.Dispatchable ParentDispatcher;

public BscUserControl()
{
InitializeComponent();
}

public BscUserControl(ref DispatchAbles.Dispatchable MyParentDispatcher)
{
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);
this.DoubleBuffered = true;
testmap = new Bitmap(this.Width, this.Height);
this.IdleTimer = new Timer();
this.IdleTimer.Interval = 50;
this.IdleTimer.Tick += new EventHandler(IdleTimer_Tick);

this.ParentDispatcher = MyParentDispatcher;
}
}
}

Initialisierung


SystemAnalysator.Klassen.Mainclasses.DispatchAbles.CollectScreenDispatcher MyParentDispatcher = new SystemAnalysator.Klassen.Mainclasses.DispatchAbles.CollectScreenDispatcher();
SystemAnalysator.Klassen.BscForm.WizIntro NewControl = new WizIntro(ref MyParentDispatcher);

16.09.2009 - 16:23 Uhr

Hallo,

mir fehlen mit absoluter Sicherheit nicht die Basics. Und entschuldige, aber welchen Sinn sollte deine Antwort erfüllen? Ich weiß wie ich Google bediene und ich habe auch in der Referenz nachgesehen. Also behandel mich hier nicht so von oben herab. Ich bin einfach ein bisschen genervt, weil eine solch simple Sache nicht funktioniert. Es kann sein, dass ich in einigen Dingen nicht mehr so ganz drin stecke, aber ich habe mir alle Grundlagen angeeignet. In der Referenz zu ref steht nichts über geerbte Klassen. So viel dazu...

Also vielen Dank für die Antwort, auch wenn sie mir kein bisschen weitergeholfen hat.

16.09.2009 - 16:08 Uhr

Es hatte einen anderen Grund. Irgendwie hatte sich ein Tippfehler eingeschlichen... Wie auch immer. Ich denke ich sollte das Projekt einfach trashen, denn langsam verliere ich die Lust daran, da sobald ich einen Fehler behebe im gleichen Moment ein neuer auftaucht und vorher noch alles funktionierte. Ich fühle mich sowas von verarscht...

Ist es nicht möglich, wenn ich folgende Struktur habe:

Object
GeerbtesObject : Object

das ich einen Konstruktor habe, der so aussieht:

public myclass(ref Object)

und dann eine Instanz von GeerbtesObject als Referenz übergebe?

16.09.2009 - 15:56 Uhr

EDIT: Hat sich erledigt, Tippfehler, woher auch immer der kam...

Hallo Leute. Es ist schrecklich. Ich habe nichts geändert. Das Programm ließ sich gestern noch kompilieren und nachdem der Fehler mit dem Designer war nicht mehr. beim Instanzieren des UserControls BscUserControl bekomme ich im Constructor die Fehlermeldung, dass er etwas zurückliefern muss. Ich muss irgendwo einen schrecklichen Fehler gemacht haben, denn irgendwie funktioniert einfach mal gar nichts mehr...

In der Hoffnung, dass irgendjemand eine Idee hat. Ich mache in der Datei eigentlich nichts spektakuläres.



public class BscUserConstrol : System.Windows.Forms.UserControl
{
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern long BitBlt(IntPtr hdcDest, int xDest, int yDest, int width, int height, IntPtr hdcSrc, int xSrc, int ySrc, int dwRop);

public paintObj[] paintObjects;
[...]

private DispatchAbles.Dispatchable ParentDispatcher;
public BscUserControl()
{
InitializeComponent();
}

public BscUserControl(ref DispatchAbles.Dispatchable MyParentDispatcher)
{
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);
this.DoubleBuffered = true;
testmap = new Bitmap(this.Width, this.Height);
this.IdleTimer = new Timer();
this.IdleTimer.Interval = 50;
this.IdleTimer.Tick += new EventHandler(IdleTimer_Tick);
this.ParentDispatcher = MyParentDispatcher;
}
}

15.09.2009 - 15:23 Uhr

Hi nochmal.

Ich bekomme hier die Kriese... Nachdem das Vererbungsproblem gelöst werden konnte kam es zu einem neuen. Ich kann keine Instanzen des Usercontrols erstellen. Ich bekomme im Designer die Fehlermeldung, dass der Konstruktor der Vaterklasse nicht gefunden werden kann. Hat jemand eine Idee? Der gleiche Code wie oben nur jetzt eine Instanz davon...


Mainclasses.DispatchAbles.CollectScreenDispatcher MyParentDispatcher = new Mainclasses.DispatchAbles.CollectScreenDispatcher();

WizIntro NewControl = new WizIntro(ref MyParentDispatcher);

15.09.2009 - 12:56 Uhr

So doof es klingt, dass habe ich schon ausprobiert... Nur bin ich scheinbar zu doof. Es ist ja eine Referenz, ich hab bei base() das ref vergessen. So ists richtig:

public WizIntro(ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable MyParentDispatcher): base(ref MyParentDispatcher)
15.09.2009 - 12:49 Uhr

Hallo Leute,

ich habe ein Problem beim Konstruktor. Ich zeige am Besten eben die Struktur:

Basisklasse:


public class BscUserControl : System.Windows.Forms.UserControl{public BscUserControl(ref DispatchAbles.Dispatchable MyParentDispatcher)
{
[...]
this.ParentDispatcher = MyParentDispatcher;
}
}

Abgeleitete Klasse:


public partial class WizIntro : SystemAnalysator.Klassen.Mainclasses.BscUserControl
{
public WizIntro(ref SystemAnalysator.Klassen.Mainclasses.DispatchAbles.Dispatchable MyParentDispatcher)
{

}
}

Dort wird schon gemeckert:

Fehler 4 "SystemAnalysator.Klassen.Mainclasses.BscUserControl" enthält keinen Konstruktor, der 0-Argumente akzeptiert. ***\Klassen\BscForm\WizIntro.cs 19 10 ***

Beim instanzieren gibts natürlich das gleiche Problem. Ich weiß leider nicht wo genau nun das Problem liegt. Den Konstruktor in der Basisklasse brauche ich aber unbedingt, da dort Funktionalitäten bereitgestellt werden, die ich in allen abgeleiteten Klassen benötige. Leider weiß ich nicht genau wonach ich hier suchen müsste. Das Prinzip der Vererbung habe ich eigentlich verstanden und hatte bisher auch nie ein Problem damit. Wenn ich den Konstruktor in der abgeleiteten Klasse weglasse funktioniert es auch nicht.

Ich hoffe auf hilfreiche Antworten.

Sutix

31.08.2009 - 09:43 Uhr

Hi, genau den Teil habe ich schon für die Windows-Keys. Trotzdem danke für deine Mühe.

31.08.2009 - 07:51 Uhr

Hallo,

ich habe folgendes Problem:
Ich arbeite momentan an einem kleinem Tool, welches automatisiert über unsere Domäne auf allen Rechnern die Hardware und Software indexiert. Hierbei hätten wir auch gerne die Möglichkeit die Lizenzkeys von verschiedener Software auszulesen, da wir häufig Volumenlizenzen verwenden.

Für Windows ist mir dies nach ein wenig googlen gelungen. Leider finde ich für Office keinen passenden snippet, sondern lediglich tools wie Jelly Beans. Konkret interessiert mich da:

Office 2003 DE
Office 2007 DE

Ich bin für jeden Tipp dankbar!
Sutix

03.04.2008 - 17:26 Uhr

Hi,
ich hatte(vielleicht habe ich es sogar noch) das gleiche Problem wie du. Der Designer ist nicht sonderlich zuverlässig und versagt schon, wenn du die WindowBorder weglässt. Meine Lösung war am Ende, dass ich den Designer nicht mehr benutzt habe. Meistens bekommt man mit dem Designer eh nicht alles hin, was man gerne haben möchte. Ich würde dir empfehlen dich mit XAML auseinanderzusetzen und die Controls ohne Designer zu erstellen, denn dort hast du einfach mehr Kontrolle. Aber stell am Besten noch dein VS so ein, dass das Formular nicht als Vorschau angezeigt wird, was den Entwicklungsprozess verlangsamt.

Alternativ kannst du auch versuchen einen anderen Editor für das reine designen zu verwenden.

01.04.2008 - 15:57 Uhr

Hi,
Ich möchte gerne bei meiner Applikation eine Traybenachrichtigung hinzufügen, wie man es aus MSN oder Thunderbird kennt(Siehe Anhang). Das ist prinzipiell relativ simpel und funktioniert auch einwandfrei.

Das Problem ist aber nun, dass das Fenster der aktuellen Anwendung den Fokus nimmt. Ich habe schon mehrere "Lösungen" im Internet gefunden, die aber nicht funktionieren. Hier im Forum gibt es zwar auch Beispiele, die sind aber anscheinend alle für WinForms und funktionieren natürlich so nicht.

Ich hoffe jemand hat eine Idee, schonmal danke im Voraus.
Sutix

31.03.2008 - 14:07 Uhr

Hi,
in meinem Programm kann man eine Liste mit Benutzern anzeigen lassen. Neben dem Namen erscheint auch ein Avatar. Das avatar wird von einer Online-Quelle geladen.

Die Probleme, die ich nun habe sind folgende:

**1. **Ich weiss nicht, wie ich es realisieren soll, dass bevor das korrekte Bild komplett heruntergeladen wird ein Dummy ("Bild wird geladen") angezeigt wird, da das Bild durch "nichts" ersetzt wird, wenn ich einfach die Source ändere.

**2. **Wie kann ich ein Bild erstellen, dass als Preloader dient? Also ich erstelle per Code ein Bild, der Inhalt lädt von der URL und sobald das Bild vollständig heruntergeladen ist wird der Inhalt dem "angezeigtem" Bild zugewiesen.

3._ _Kann ich Bilder irgendwie Cachen lassen, also, dass Bilder z.B. bei erneutem erstellen nur alle xx Minuten heruntergeladen werden?

Wie immer bin ich für jede Hilfe dankbar.
Sutix

26.03.2008 - 12:51 Uhr

Ja, den gibt es, aber der bringt mir ja auch nichts, wenn das Programm dann immer noch nicht richtig funktioniert. Den IE an sich benutze ich ja eh nicht zum surfen,sondern lediglich um Kompatibilitäten zu testen. Aber soweit ich weiss werden in WPF Webinhalte mit der IE-Engine gerendert. Da wird das Problem liegen.
Unter den Updates habe ich keinen Eintrag zu Windows Internet Explorer gefunden.

26.03.2008 - 12:11 Uhr

Hi,
da ich primär Webentwickler bin habe ich auf meinen Firmen-Rechner mal die neue Beta-Version des Internet-Explorers installiert. Nach der installation funtioniert jedoch ein Programm von mir nicht mehr, dass vorher so einwandfrei funktionierte. Ich nehme mal an, dass dies am IE8 liegt.

Ich habe leider keine Idee, wie ich ein Downgrade auf den 7er mache, da es keine Deinstallationsmöglichkeit gibt. Vielleicht kann mir ja jemand helfen. Es kann natürlich auch sein, dass es ein Fehler im Quellcode ist. Hier mal ein paar Details zur fehlerhaften stelle. Der Code-Teil ist ein BitmapImageConverter.


[ValueConversion(typeof(Uri), typeof(BitmapImage))]
public class BitmapImageConverter : IValueConverter
{
public object Convert
(object value, Type targetType, object parameter, CultureInfo culture)
{
Uri fileUri = (Uri)value;
BitmapImage previewImage = new BitmapImage(fileUri);
previewImage.DecodePixelHeight = 80;
previewImage.DecodePixelWidth = 60;
return previewImage;
}

public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
{
// Nicht implementiert
return null;
}
}

Fehlermeldung ist folgende:
System.ArgumentException wurde nicht von Benutzercode behandelt.
Message="Der Wert liegt außerhalb des erwarteten Bereichs."
Source="mscorlib"
StackTrace:
bei System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
bei MS.Win32.WinInet.get_InternetCacheFolder()
bei System.Windows.Media.Imaging.BitmapDownload.BeginDownload(BitmapDecoder decoder, Uri uri, RequestCachePolicy uriCachePolicy, Stream stream)
bei System.Windows.Media.Imaging.LateBoundBitmapDecoder..ctor(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy requestCachePolicy)
bei System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache)
bei System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()
bei System.Windows.Media.Imaging.BitmapImage.EndInit()
bei System.Windows.Media.Imaging.BitmapImage..ctor(Uri uriSource, RequestCachePolicy uriCachePolicy)
bei System.Windows.Media.Imaging.BitmapImage..ctor(Uri uriSource)
bei Notifier.BitmapImageConverter.Convert(Object value, Type targetType, Object parameter, CultureInfo culture) in C:[...]\App.xaml.cs:Zeile 76.
bei System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
bei System.Windows.Data.BindingExpression.Activate(Object item)
bei System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt)
bei System.Windows.Data.BindingExpression.AttachOverride(DependencyObject target, DependencyProperty dp)
bei System.Windows.Data.BindingExpressionBase.OnAttach(DependencyObject d, DependencyProperty dp)
bei System.Windows.StyleHelper.GetInstanceValue(UncommonField`1 dataField, DependencyObject container, FrameworkElement feChild, FrameworkContentElement fceChild, Int32 childIndex, DependencyProperty dp, Int32 i, EffectiveValueEntry& entry)
bei System.Windows.TemplateApplicationHelper.SetDependencyValueCore(DependencyObject dependencyObject, DependencyProperty dp, Object value)
bei System.Windows.Markup.BamlRecordReader.SetDependencyValue(DependencyObject dependencyObject, DependencyProperty dependencyProperty, Object value)
bei System.Windows.Markup.BamlRecordReader.SetDependencyComplexProperty(Object currentTarget, BamlAttributeInfoRecord attribInfo, Object o)
InnerException:


Das Problem bestand schon vor der Installation des SP1 für Vista.
Hinweise zum deinstallieren würden mir auch schon reichen, was man da so bei Google findet funktioniert aber nicht, da es nicht unter "Programme und Funktionen" angezeigt wird.

19.02.2008 - 14:33 Uhr

Hallo JamesPond,

hier ist ein Beispiel dazu aufgeführt:
Minimizing a window to the System Tray on a Close event

Ich hoffe, dass dir das weiterhilft.

19.02.2008 - 10:08 Uhr

Hi,
für alle, die es auch noch interessiert das Standard-Aussehen von Fenstern zu überschreiben, dem ist dieser Blog-Eintrag zum empfehlen:
Custom Window Control - GlassWindow - Source Code

Finde es recht nett umgesetzt, auch wenn es bei mir unter Vista nicht allzu performant beim Resize ist.

18.02.2008 - 20:02 Uhr

Nein, hat damit auch wenig zu tun, ob ich "Name" oder x:Name verwende ist egal. Es liegt wohl an einer Beschränkung von WPF, wie ich nach stundenlangem googlen herausgefunden habe. user-Controls kann man wohl so nicht benutzen... Naja, mal sehen, muss ich halt ein CustomControl irgendwie das verhalten eines Fensterrahmens aufzwängen 😁

18.02.2008 - 16:14 Uhr

Nein, hat damit leider nichts zu tun. Es ist egal, welchen Namen ich für ein Element angebe. Ich nehme mal an, dass es etwas mit der Struktur zu tun hat. In der XAML-Datei des UserControls sind einige Elemente mit Namen benannt und ich nehme mal an, dass der Content-Presenter als "Ein Element" gesehen wird und demzufolge die Inhalte keine Namen bekommen können. Also wird man wohl irgendwie angeben müssen, dass die Kind-Elemente eigenständig sind oder sowas. Ich weiss es nicht. Ich finde da leider auch nicht so viel zu.

18.02.2008 - 13:12 Uhr

Hi,
ich habe mal wieder ein Problem mit meinem eigenem Control. Wenn ich als Content benannte Elemente(Mit Name="Bla"😉 einfüge, dann bekomme ich folgenden Fehler:

Fehler: Der Wert "test" des Name-Attributs kann für das Element "TextBox" nicht festgelegt werden. "TextBox" befindet sich im Bereich des Elements "vistaFrame", für das bereits ein Name registriert wurde, als es in einem anderen Bereich definiert wurde.

Hier ist mal die Code-Behind-File von dem UserControl:

[ContentProperty("Content";)]
public partial class vistaFrame : UserControl
{
public delegate void startDrag(EventArgs e);
public event startDrag onDragStart;
public delegate void closeClicked(EventArgs e);
public event closeClicked onCloseClicked;
public string windowTitle
{
get { return (string)GetValue(windowTitleProperty); }
set { SetValue(windowTitleProperty, value); }
}
public UIElement Content
{
get { return (UIElement)GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
public Visibility titleBarVisibility
{
get { return (Visibility)GetValue(titleBarVisibilityProperty); }
set { SetValue(titleBarVisibilityProperty, value); }
}
public static readonly DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof(UIElement), typeof(vistaFrame));
public static readonly DependencyProperty windowTitleProperty = DependencyProperty.Register("windowTitle", typeof(string), typeof(vistaFrame));
public static readonly DependencyProperty titleBarVisibilityProperty = DependencyProperty.Register("titleBarVisibility", typeof(Visibility), typeof(vistaFrame));

[...Events...]
}

Darf ich vielleicht generell in dem Usercontrol nicht mit Namen benennen oder gibt es dafür einen Wrapper etc.?
Wie immer bin ich für jegliche Hilfe sehr dankbar 👅

18.02.2008 - 11:02 Uhr

Hi,
da ich weder hier noch bei Google auch nur ein einziges brauchbares Ergebnis finde frage ich nun mal. Wie zur Hölle bringe ich es unter WPF fertig, dass ein animiertes GIF so angezeigt wird, wie man es erwartet: Animiert?! Ich weiss, dass das irgendwie mit den Bordmitteln geht, weiss nur nicht mehr wie. Ich meine es ging mit MediaElement, aber das klappt so auch nicht.

EDIT:
Ui. Seltsamerweise scheint es bei GIFs zu funktionieren, die von einer Web-Adresse geladen werden🤔

14.02.2008 - 11:28 Uhr

Aaaaaah wie geil 👅 👅 👅
Der Quelltext-Editor 😁 Den hab ich natürlich nicht ausprobiert 😉 Aber damit gehts jetzt+intelliSense. Besten Dank!
Kaxaml gefällt mir aber auch ganz gut, alleine schon, weil es schneller ist 😉

14.02.2008 - 11:14 Uhr

Oder doch Expression Blend. Dort hast Du keine Umschalterei

Expression Blend ist wohl eher was für die Designer 🤔 Ich will das gegenteil, nicht den Designmodus, nur den Textmodus. Also alles per Hand schreiben nur mag ich es, wenn ich Tippfehler gleich vermeiden kann, wenn ich nur Enter drücken muss nachdem ich ein paar Buchstaben getippt habe.

Wieso sollte dir Intellisense verloren gehen? Welchen Editor hast du denn ausgewählt?

Ich habe da mal verschiedene ausprobiert, aber IntelliSense ist nur im Standard-Editor vorhanden, der aber auch den Entwurf-Tab hat.

Mehr gibts da nicht bei mir 🙄
Ist jetzt nichts weltbewegendes nur arbeiten mit XAML ist generell schon so langsam, da brauche ich nicht noch eine zusätzliche Bremse.

empfehlen kann ich Dir Kaxaml oder XamlPadX 3. Kaxaml gefällt mir persönlich etwas besser.

Danke für die Tipps, werde ich mir bei Gelegenheit mal ansehen. Muss gerade eh noch einige Steuerklassen zu Ende schreiben, also bleibt mir das Zeitlupen-Arbeiten erstmal ein wenig erspart :evil:

14.02.2008 - 08:51 Uhr

Okay... Das war dann so in etwa was ich wollte ;-D Intelli-Sense sollte mir eigentlich erhalten bleiben. Ich wollte nur diese Nutzlose Vorschau-/Designerfunktion abstellen. Trotzdem danke. Werde dann wohl mal nach alternativen XAML-Editoren gucken.

14.02.2008 - 08:26 Uhr

Hi,
wenn ich in meinen Projekten die XAML-Dateien editiere lädt ständig dieser nutzlose Designer mit. Ich habe schon eingestellt, dass der Quelltext immer in voller größe angezeigt wird, trotzdem wird auch immer das Design(Was zu 95% falsch dargestellt wird...) im Hintergrund mit und bremst alles ziemlich aus. Würde gerne mal wissen, ob es eine möglichkeit gibt den Designer ganz zu deaktivieren, da ich ihn nicht brauche.

12.02.2008 - 17:27 Uhr

Interessante Wendung beim Problem. Ich habe es nun mal mit RoutedUICommand versucht. Damit scheint es sogar zu klappen, aber anders als ich erwarte.

Hier das CustomControl:


public class userControl : Control, ICommand
{
private static RoutedUICommand browseCommand = new RoutedUICommand("Browse", "browse", typeof(userControl), new InputGestureCollection(new InputGesture[] { new MouseGesture(MouseAction.LeftClick) }));
public static RoutedUICommand Browse
{
get { return browseCommand; }
}
static userControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(userControl), new FrameworkPropertyMetadata(typeof(userControl)));
CommandManager.RegisterClassCommandBinding(typeof(userControl), new CommandBinding(browseCommand, ExecuteBrowseCommand, CanExecuteBrowseCommand));
MessageBox.Show("Command Registriert");
}

public static void CanExecuteBrowseCommand(object sender, CanExecuteRoutedEventArgs e)
{
MessageBox.Show("CanExecuteBrowseCommand aufgerufen");
e.Handled = true;
}

public static void ExecuteBrowseCommand(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("ExecuteBrowseCommand aufgerufen");
}
[...]
}

Und das dazugehörige Template:


<Style x:Key="{x:Type userControl:userControl}" TargetType="{x:Type userControl:userControl}">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="IsTabStop" Value="false" />
<Setter Property="Focusable" Value="false" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type userControl:userControl}">
<ControlTemplate.Resources>
<mainApp:BitmapImageConverter x:Key="bitmapImageConverter"/>
</ControlTemplate.Resources>
<Border ForceCursor="True" Cursor="Hand" Background="#01FFFFFF" Padding="0,3,0,3" Height="86" MaxHeight="86" MinHeight="86" Width="Auto" HorizontalAlignment="Stretch">
<Border.CommandBindings>
<CommandBinding Command="userControl:userControl.Browse"/>
</Border.CommandBindings>
<Grid x:Name="outerBorder">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="70" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="80"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Grid.Column="0" HorizontalAlignment="Center" Width="70" Height="80" MaxHeight="80" MinHeight="80" VerticalAlignment="Stretch">
<Image Source="{TemplateBinding Avatar, Converter={StaticResource bitmapImageConverter}}" Stretch="Fill" ClipToBounds="True" HorizontalAlignment="Center" VerticalAlignment="Stretch" Width="60" SnapsToDevicePixels="True" Height="80" />
</Border>
<Border Grid.Row="0" Grid.Column="1" Width="Auto" Height="80" MaxHeight="80" MinHeight="80" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<TextBlock FontFamily="Verdana" FontWeight="Bold" Foreground="#FFF" Text="{TemplateBinding Nick}" VerticalAlignment="Top" Margin="0,10,0,0" Width="Auto" HorizontalAlignment="Left" SnapsToDevicePixels="True" />
</Border>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="outerBorder" Property="Background" Value="#69C"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

Den Command binde ich so ein

<Border.CommandBindings>
<CommandBinding Command="userControl:userControl.Browse"/>
</Border.CommandBindings>

Wenn ich die Anwendung starte erscheint die MessageBox aus dem statischem Konstruktor. Wenn ich aber nun auf das Control Klicke bin ich etwas verwundert. Es erscheint die Meldung aus dem CanExecuteBrowseCommand Handler. Prinzipiell würde es so ja funktionieren, nur glaube ich nicht, dass es so beabsichtigt ist. Vielleicht hat ja jemand eine Idee, wieso das so passiert oder was ich falsch mache/verstehe.

07.02.2008 - 18:20 Uhr

Was auch immer du da mit Expandern willst... Ich meinte eher so:


<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Button Grid.Row="0"></Button>
<Button Grid.Row="1"></Button>
<Button Grid.Row="2"></Button>
</Grid>
07.02.2008 - 18:02 Uhr

Ich glaube kein mensch versteht, was du da machen willst!?
Es wäre hilfreich, wenn du dir etwas mehr mühe geben würdest genauer zu beschreiben, was wann und wie passieren soll. Und was soll das für einen Sinn ergeben, ein Control bei events zu löschen und wieder anders neu einzufügen?

07.02.2008 - 17:55 Uhr

Ja, da gibt es viele möglichkeiten.
Entweder du lässt die größe des Fensters automatisch anpassen. Du steckst das ganze in ein Stackpanel. Du kannst ein Grid mit Rows erstellen...
Bei dir liegt es aber akut daran, dass du ein Grid mit nur einer Zeile und einer Spalte hast. DIe Controls werden einfach übereinander gelegt. Defenier 3 Rows, dann sollte das gehen, die Controls dann mit Grid.Row="x" entsprechend platzieren.

07.02.2008 - 16:03 Uhr

Hi,
so langsam bin ich am Verzweifeln. Ich bin dabei meine Anwendung ein wenig umzustrukturieren, so dass es mehr dem Sinn von WPF entspricht. Ich möchte gerne meine Controls völlig von der Visuellen Darstellung trennen. Das bedeutet, dass meine Objekte ein paar DependencyProperties besitzen aber auch auf Events reagieren können sollen. Nach einigem suchen habe ich festgestellt, dass dies via Commands gelöst werden soll.

Ich habe dazu verschiedene Methoden ausprobiert. Erst mit ICommand und dann mit ICommandSource(Nach einem Beispiel von MSDN). Aber egal wie ich es drehe, ich bekomme es nicht hin, dass bestimmte Elemente auf Commands reagieren können(In Templates).

Hat jemand ein kurzes Beispiel, wie ich dies umsetzen könnte?

Mal ein wenig von dem, was ich gemacht habe:

void OnDragWindow(object sender, ExecutedRoutedEventArgs args)
{
MessageBox.Show("Dragging";);
}

public static readonly ICommand dragWindow = new RoutedCommand("dragWindow", typeof(glassFrame), new InputGestureCollection(new InputGesture[] { new MouseGesture(MouseAction.LeftClick) }));

So in etwa sollte es funktionieren:

<ControlTemplate x:Key="glassFrameTemplate" TargetType="{x:Type local:glassFrame}">
<Border Height="25" Width="250" Background="Black">
<Border.CommandBindings>
<CommandBinding Command="{Binding ?dragWindow?}" />
</Border.CommandBindings>
</Border>
<!--{x:Static c:Klasse.Command}-->
</ControlTemplate>

Ich denke mal, dass ich das wohl über das ICommandSource Interface lösen muss und dann irgendwas mit DependencyProperties anstellen muss, damit ein Binding klappt. Das ganze soll dann in der Klasse des Controls Methoden aufrufen, die z.B. Events feuern oder ähnliches. Wäre für Infos sehr dankbar.

06.02.2008 - 16:38 Uhr

Ja, dachte ich mir auch. Funktioniert aber irgendwie so nicht. Ich kopier mal einfach den ganzen Quelltext hier rein:

Klasse:

public class UserClass : Control
{
static UserClass()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(UserClass), new FrameworkPropertyMetadata(typeof(UserClass)));
}

public UserClass()
: base()
{

}

public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UserClass));

}

Style:

<Style x:Key="{x:Type myUsers:UserClass}" TargetType="{x:Type myUsers:UserClass}">
<Setter Property="SnapsToDevicePixels" Value="true" />
<Setter Property="OverridesDefaultStyle" Value="true" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type myUsers:UserClass}">
<TextBlock Text="{Binding Path=Text}" Foreground="White" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

Und das Fenster:


<Window x:Class="Notifier.Test" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:myControls="clr-namespace:Notifier.controls" xmlns:myUsers="clr-namespace:Notifier.controls.UserControls" Title="Test" Height="Auto" Width="Auto" SizeToContent="WidthAndHeight" AllowsTransparency="True" Background="Transparent" WindowStyle="None">
<myControls:windowframe windowTitle="Hallo Welt" footText=";(c) By XXX GmbH" onDragStart="dragWindow" onCloseClicked="closeButtonClicked">
<StackPanel Orientation="Vertical">
<myUsers:UserClass Text="Hallo" />
<TextBlock>Hallo</TextBlock>
<TextBlock>Hallo</TextBlock>
<TextBlock>Hallo</TextBlock>
</StackPanel>
</myControls:windowframe>
</Window>

Vielleicht ein wenig viel, aber ich denke ich habe da einfach irgendwas noch nicht richtig verstanden. Eigentlich schade, denn ich denke wenn man diese Techniken besser beherrscht kann man viel mehr daraus machen.

EDIT:
Des Rätsels Lösung mal wieder super simpel aber dennoch Effektiv:

<TextBlock Text="{TemplateBinding Text}" Foreground="White" />
06.02.2008 - 15:21 Uhr

Ich finde inzwischen immer mehr Gefallen an den DPs 😁 Ich denke ich werde mein aktuelles Projekt noch einmal etwas überarbeiten und die Controls neu erstellen.
Allerdings stoße ich dann wieder auf ein anderes Problem...

Ich habe mir ein generelles Control erstellt, dass einen Benutzer repräsentieren kann. Dies ohne dazugehöriges XAML(Custom Control). Der Benutzer kann in 4 verschiedenen Ansichten dargestellt werden. Das wollte ich mit ControlTemplates lösen, da es mir am Sinnigsten erschien. Nun ist nur die Frage, wie ich auf folgendes im Template zugreifen kann.

<myUser:UserControl Text="Name" AvatarSource="http://www.host.de/image.jpg" LinkUrl="http://www.google.de" />

Nun häng ich hier:


<Style x:Key="{x:Type myUsers:UserClass}" TargetType="{x:Type myUsers:UserClass}">
			<Setter Property="SnapsToDevicePixels" Value="true" />
			<Setter Property="OverridesDefaultStyle" Value="true" />
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="{x:Type myUsers:UserClass}">
						<TextBlock Text="???{Binding RelativeSource={RelativeSource Self}, Path=Text}???" />
					</ControlTemplate>
				</Setter.Value>
			</Setter>
		</Style>

Das ist erstmal vereinfacht nur der Text, aber ich häng da grad. Keine Ahnung, wie ich nun auf die Eigenschaften zugreifen kann.

06.02.2008 - 13:03 Uhr

Habe ich schon, kann sein, dass ich das ein wenig falsch ausgedrückt habe.


/// <summary>
/// Angezeigter Titel des Fensters
/// </summary>
public string windowTitle
{
get { return (string)GetValue(windowTitleProperty); }
set { SetValue(windowTitleProperty, value); }
}

Ich setze die Properties einfach nur. Denke eigentlich, dass es so richtig ist. Oje, WPF ist teilweise schon verwirrend 👅

06.02.2008 - 12:24 Uhr

Ich mag ja kaum anzweifeln, was du sagst, da mein Wissen dazu einfach nicht ausreichend ist, aber nach meinem Verständnis gehört die Property zum Control, da ich es in der Klasse(dem Usercontrol) als stinknormale Eigenschaft hinzugefügt habe und im getter und setter einfach die Werte über das binding setze. Die Depedency-Objekte wurden(nach meinem Verständnis, korrigier mich, wenn ich falsch liege) nur so registriert, damit ich das einfach so in der XAML-Datei als Wert eintragen kann.
Scheint für mich so am sinnigsten zu sein.

Finde ich schöner als sowas(ähnliches):


Binding binding = new Binding();
// Set source object
binding.Source = treeView;
// Set source property
binding.Path = new PropertyPath(“SelectedItem.Header”);
// Attach to target property
currentFolder.SetBinding(TextBlock.TextProperty, binding);

06.02.2008 - 12:08 Uhr

Ja, das habe ich. Besten Dank, der Owner war das Problem. jetzt geht es und ich bin ein glücklicher Mensch 😛 . Wie einem Kleinigkeiten manchmal die Tour vermasseln können.

So geht es dann:

public static readonly DependencyProperty windowTitleProperty = DependencyProperty.Register("windowTitle", typeof(string), typeof(windowframe));
06.02.2008 - 11:40 Uhr

Hi,
Ich habe in XAML ein Usercontrol geschrieben, dass einen Fensterrahmen nachbildet. Ganz simpel eine Titelleiste, einen Rahmen, ein Schliessen-Button und eine Statusleiste. Dieses Control wird in einem Richtigem Fenster als Root-Element eingefügt und der "echte Rahmen" einfach ausgeblendet.

Nun will ich natürlich, dass ich für diesen Inhalt folgende Notation verwenden kann:

<Window x:Class="Notifier.Test" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:myControls="clr-namespace:Notifier.controls" Title="" Height="Auto" Width="Auto" SizeToContent="WidthAndHeight" AllowsTransparency="True" Background="Transparent" WindowStyle="None">
<myControls:windowframe windowTitle="Hallo Welt" footText="© By XXX GmbH" onDragStart="dragWindow" onCloseClicked="closeButtonClicked">
<StackPanel Orientation="Vertical">
<TextBlock>Hallo</TextBlock>
<TextBlock>Hallo</TextBlock>
<TextBlock>Hallo</TextBlock>
</StackPanel>
</myControls:windowframe>
</Window>

Für den Inhalt klappt das auch mehr als Wunderbar mit einer Bindung, die in der codebehindfile so aussieht:
Vor der Klassendeklaration:


[ContentProperty("visualContent";)]
public partial class windowframe : UserControl
{
[...]
}

Eigenschaft:


public UIElement visualContent
{
get { return (UIElement)GetValue(visualContentProperty); }
set { SetValue(visualContentProperty, value); }
}

public static readonly DependencyProperty visualContentProperty = DependencyProperty.Register("visualContent", typeof(UIElement), typeof(UIElement));

Und so sieht das Element in der XAML-Datei aus:


<ContentPresenter Content="{Binding visualContent, ElementName=root}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto" Width="Auto" />

Nun möchte ich das gleiche auch noch für ein paar andere Elemente erreichen, aber auf die gleiche Art und Weise. Z.B. für den Titel. Das habe ich auch alles soweit schon probiert, aber es scheint so nicht zu klappen. Das Problem liegt bei der DependencyProperty, die ich für den Textblock folgendermaßen notiert habe:

public static readonly DependencyProperty windowTitleProperty = DependencyProperty.Register("windowTitle", typeof(string), typeof(TextBlock), new FrameworkPropertyMetadata((string)"Titel";));

Der Inhalt "Titel" wird auch als Standard-Text angezeigt, aber wenn ich im XAML-Code einen anderen Wert angebe wird dieser nicht übernommen. Meine Vermutung geht ja dahin, dass ich beim registrieren genauer Definieren müsste, welche Zieleigenschaft angesprochen werden soll, was ja in diesem Fall TextProperty wäre. Funktioniert aber so leider nicht.

Jemand eine Idee, wie ich das umsetzen kann(möglichst auf diese Art)?

So muss es dann korrekt aussehen:

public static readonly DependencyProperty windowTitleProperty = DependencyProperty.Register("windowTitle", typeof(string), typeof(windowframe));
05.02.2008 - 15:11 Uhr

Hi,
ich verstehe glaube ich nicht ganz genau, was du machen willst. Es wäre ganz Hilfreich, wenn du beschreiben könntest, was genau du machen willst und wie es aussehen soll, ich denke dann kann man dir besser helfen 😉

Aber trotzdem vermute ich mal, dass das was du machen möchtest eher mit Control-Templates geregelt werden kann, die man bestimmt per Trigger wechseln kann 😉

05.02.2008 - 13:02 Uhr

Hallo aQwa, dass sollte funktionieren:** **

 <Tooltip Style="{StaticResource ErrorTextBoxStyle}">Hallo Welt</Tooltip>
 
26.10.2007 - 12:51 Uhr

Ja, ich habe Vista, aber die meisten unserer Benutzer haben Windows XP. Ich denke da muss ich einfach mal gucken, wie es mit der Beschleunigung unter Vista aussieht. Irgendwo fliegen noch Notebooks mit XP rum 🙂 . Gibt doch auch bestimmt eine Möglichkeit animationen zu überspringen und sofort das Ende anzuzeigen.

EDIT:
So habe das mal unter Windows XP auf einem durchschnittlichem Notebook getestet und es läuft sehr Performant, auch wenn ich ein Stackpanel mit 300 recht aufwendig gestylten Items habe. Keine Animation ruckelt oder hängt irgendwie.

26.10.2007 - 11:13 Uhr

Das ist jetzt eher eine schlechte nachricht, ich habe einen sehr visuell ansprechenden Content, wo auch vieles animiert wird. Dass es nur per Software gerendert wird könnte ein Problem sein. Ich denke ich werde einfach im Optionsdialog eine Einstellung anbieten, die die animationen an bzw. ausstellt.

Das ist eigentlich schade. Denn die möglichkeiten von WPF sind einfach atemberaubend. Mit so wenig Aufwand solch wunderbaren Sachen zaubern 🙂 . Aber was solls 😉

25.10.2007 - 00:19 Uhr

Okay, den Teil habe ich dann wohl im buch überlesen 😁 - Danke für die Aufklärung, das vermindert meinen Zeitverbrauch ungemein!

Danke für die Hinweise, werde ich in zukunft drauf achten, wollte nur nicht 100te Themen an einen Tag eröffnen und am Ende als Spam-King gelten 😉

Was mich zu deiner Antwort aber noch interessiert, da du dich scheinbar damit auskennst. Ist der Zustand mit den Triggern >noch< ein zeitliches Problem der implementierung durch Microsoft oder wird es so bleiben? Vor allem, da das Zitat über 3.0 spricht und ich auf Basis der 3.5 Beta entwickle und es da genauso ist.

Und:

Normal würde ich sagen Doku lesen[...]

Glaube mir, ich habe gegoogled, ewigkeiten(vielleicht mit den falschen Schlagwörtern). Ich habe es am Ende immer mit Templates gemacht, da ich die verwendeten Controls eh überall ändern wollte nur in diesem speziellem Fall brauchte ich es nur ein mal und wollte dafür nicht extra ein Template anlegen. und bevor ich dann meinen Monitor fast vor Wut zerschlagen habe, habe ich halt eben gefragt 😉 Du kannst das Thema ja ab dem 3. Eintrag splitten.

24.10.2007 - 19:16 Uhr

Weiss irgendjemand, ob es irgendwo eine Liste der erlaubten Property's bei Triggern der einzelnen Controls gibt?

Denn nach meinem Verständnis müsste folgender Code korrekt sein, ist er aber laut VS nicht und lässt mich nicht kompilieren:

[...]<Grid Grid.Column="1">
<Grid.Triggers>
<Trigger Property="MouseHover" Value="true">
<Setter Property="Opacity" Value="1" TargetName="closeImage" />
<Setter Property="GlowSize" Value="5" TargetName="closeGlow" />
</Trigger>
</Grid.Triggers>
<Image Name="closeImage" Opacity="0.5" HorizontalAlignment="Center" Height="12" VerticalAlignment="Center" Source="pack://application:,,,/Resources/close2.png" Margin="0">
<Image.BitmapEffect>
<OuterGlowBitmapEffect x:Name="closeGlow" GlowColor="#FFAA0000" GlowSize="0" /></Image.BitmapEffect>
</Image>
</Grid>[...]

woanders klappt es aber Super, so z.B. :

<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="TextBlock.Foreground" Value="#FFFFFFFF" TargetName="HLcontentText" />
<Setter Property="Background" Value="#22FFFFFF" TargetName="HLBorder" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="TextBlock.Foreground" Value="#FFFFFFFF" TargetName="HLcontentText" />
<Setter Property="Background" Value="#22FFFFFF" TargetName="HLBorder" />
</Trigger>
</ControlTemplate.Triggers>

Ich bin wohl einfach zu blöd dafür?!

24.10.2007 - 16:09 Uhr

Hi,
ich weiss, dass es möglich ist in WPF 3D Dinge zu erstellen. Wäre es auch möglich z.B. ein Grid in einen für 3D-View Container zu packen und dieses Grid dann mit Inhalt drehen, so dass es aussieht, als würde man die Rückseite betrachten(Wobei ein 2. vorher verstecktes Grid sichtbar wird und das vorherige dann versteckt wird)?

Es soll so aussehen:
http://www.youtube.com/watch?v=IdG1g0eAlJ8
Wenn man Einstellungen ändert dreht sich das Widget.

24.10.2007 - 13:12 Uhr

Ich hatte das Fenster vorher in einem anderem Projekt und habe dann nachträglich den Namespace an das neue Projekt angepasst. Es funktioniert ja auch alles korrekt bei der Ausführung und lässt sich auch normal kompilieren.

Blender geht leider nicht, da die Testversion abgelaufen ist. Es ist eigentlich auch nicht so wichtig, da es in der Vorschau eh nie korrekt dargestellt wird, wenn man AllowTransperency an hat, aber man kann wenigstens grob sehen ob es passt oder nicht. Irgendwie ärgerlich, ich hoffe dass die Final Version besser wird.

Nebenbei mal: Stürzt bei euch unter Vista die IDE auch fast jedes 4.-5. mal beim kompilieren ab(wenn was im XAML geändert wurde)?

24.10.2007 - 11:42 Uhr

Hi, ich habe einen Fehler in VS, der mir nicht sehr viel sagt. Die XAML war vorher noch in Ordnung, nun wird ein Fehler angezeigt.
Ich hätte gerne die Vorschau beim beabreiten wieder aktiv, dass ich nicht jedesmal neu kompilieren muss um zu sehen, ob etwas passend ist.

Der Fehler ist als Bild angehängt.

Das Window+Eigenschaften:

<Window x:Class="Stayblue_Notifier.windows.notify" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="notify" Height="140" Width="210" SizeToContent="Height" AllowsTransparency="True" WindowStyle="None" Loaded="Window_Loaded" Background="#00000000" Topmost="True" ShowInTaskbar="False" MouseLeftButtonUp="Window_MouseLeftButtonUp" MouseEnter="Window_MouseEnter" MouseLeave="Window_MouseLeave" SizeChanged="Window_SizeChanged">

Ich benutze MS VS'08 die aktuellste Beta.

23.10.2007 - 00:43 Uhr

Genau das ist ja mein Problem.
Es soll wie schon gesagt zum erstellen von Sprite-Animationen dienen. Die einzelnen Bilder sollen frei Skalier- und Drehbar sein.

Das Bild dreht sich nicht mit, das will ich aber.

So soll das am Ende aussehen

22.10.2007 - 16:06 Uhr

So etwas dachte ich mir schon, aber mich würde trotzdem interessieren, ob es sehr performant ist.

Ich habe nun gestern noch ein wenig mit Pathes rumgespielt und auch fast alles so hinbekommen wie ich wollte. Problem ist nur die Grafik der Objekte. Es sind alles Rechtecke, also nichts schwieriges. Doch wie bekomme ich es hin eine Grafik genauso wie das Rechteck zu transformieren?

Ich hatte schon versucht das Bild als TextureBrush zu verwenden, was aber auch keine wirklich befriedigende Ergebnisse lieferte. Ich habe leider keine Ansätze gefunden, ausser das ganze Graphics-Objekt zu rotieren, Bild und Linien zu zeichnen und Rotation rückgängig machen, was ich aber nicht so optimal finde.

22.10.2007 - 00:52 Uhr

Hi,

ich arbeite momentan an einem Programm, dass zum editieren bzw. erstellen von animierten Sprites für einen MMO-Client benutzt werden soll.

Aber ich scheitere schon in den Anfängen und die vielen anderen Themen hierzu haben mir irgendwie nicht ganz so sehr geholfen.

Probleme wie das verschieben, rotieren und skalieren sind in den anderen Themen schon ausreichend diskutiert und erläutert worden, was auch für mich ganz hilfreich war. Nun habe ich aber ein anderes Problem. Ich habe mir mehrere Klassen für dieses Programm erstellt:

Eine Klasse um alle Seiten der Animation anzuzeigen und inhalte zu transformieren etc. also der Anzeiger.

Eine Klasse, die eine einzelne Seite in der Animation darstellt. Welche ein Array von Objektinstanzen der letzten Klasse hat:

Eine Klasse, die eine einzelne Sprite darstellt.

Mein Problem ist nun, dass ich gerne jede Sprite so speichern möchte, wie sie momentan auch dargestellt wird, was heisst auch mit allen Transformationen etc. da ich es schwachsinnig finde, dass bei jedem neuzeichnen alle Transformationen neu angewendet werden. Ich dachte mir erst, dass ich das alles in einem Graphics-Objekt abspeichere und diese beim neuzeichnen einfach wieder übereinander lege, was aber nicht klappt, da ich nicht weiss, wie ich in einem Graphics-Objekt den Inhalt eines anderen einfügen kann.

Vllt hat ja jemand eine Idee, wie es möglich ist transformierte Graphics abzuspeichern, ohne, dass sie jedesmal neu generiert werden, wenn sie benötigt werden.

06.06.2007 - 22:37 Uhr

Danke herbivore,
hätte ich auch mal drauf kommen können, aber wie war das mit dem Wald und den Bäumen 😉 .

Das sieht nun so aus:


        private void EditorCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            int Y_Coord = e.Y-(e.Y / (12 + _rowSpacing));
            if (CursorPos.Row != Y_Coord / (12 + _rowSpacing))
            {
                CursorPos.Row = Y_Coord / (12 + _rowSpacing);
                this.Invalidate();
            }
        }