Hallo,
Dravere schrieb:
In dem man die Dokumentation liest.
Manchmal übersieht man die naheliegensten Möglichkeiten. Ich wusste dass da irgendwas war, hab's aber einfach nicht gefunden.
Dravere schrieb:
Ich empfehle Zoom oder StretchImage . Alternativ kannst du natürlich auch das Bitmap verkleinern, dürfte auch etwas Speicher schonender sein:
Bitmap bigBitmap = ...;
var smallBitmap = new Bitmap(240, 240);
var g = Graphics.FromImage(smallBitmap);
g.DrawImage(bigBitmap, new Rectangle(0, 0, 240, 240));
g.Dispose();
bigBitmap.Dispose();
// use smallBitmap
(ungetestet)
Auch dafür vielen Dank, das hilft mir weiter.
Gruß
Michael
Okay, ich habe jetzt die Klasse etwas geändert, so dass ich jetzt eine Property habe und es funktioniert alles. Gibt es eine Möglichkeit das this.DataContext=einA; wegzulassen und einA stattdessen beim Binding in die Source Eigenschaft zu schreiben?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;
namespace einName
{
public partial class Page1 : Page
{
a einA = new a();
public Page1()
{
InitializeComponent();
this.DataContext = einA;
}
}
class a : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
private bool _b=false;
public bool b
{
get
{
return _b;
}
set
{
_b = value;
OnPropertyChanged(new PropertyChangedEventArgs("b"));
}
}
}
}
...
IsEnabled="{Binding Path=b}"
...
huddi schrieb:
Oh Wahnsinn, das funktioniert ja doch.
Oh Wahnsinn, wer hätte das gedacht
huddi schrieb:
Allerdings abonniere ich jetzt das Exited Event immer mitten im Code in
der Schleife. Ist bestimmt unschön oder :)?
Funktioniert aber einwandfrei so wie ich das sehn kann.
Events in einer Schleife abonnieren ist doch kein Problem. Zusammen mit Lambdas finde ich das sogar recht elegant.
Du könntest nur auf ein Problem stoßen: Wenn Du innerhalb der Schleife die Process-Objekte erstellst und nur Schleifen-lokale Referenzen hast (so hört es sich bisher jedenfalls an), sind sie in der nächsten Iteration Freiwild für den Garbage-Collector. Die Process-Objekte in der Schleife halten eine Referenz auf die Eventhandler des Exited-Events, aber kein anderes Objekt hält mehr eine Referenz auf die Process-Objekte. Das wäre in dem Fall reines Glücksspiel, ob die Objekte den Zeitraum der Beobachtung überleben, oder vom GC einkassiert werden. Werden sie zerstört, können sie auch kein Event mehr feuern und Dein Zähler wird nicht wie erwünscht dekrementiert.
Falls Du also innerhalb der Schleife die Process-Objekte erstellst, solltest Du die Referenzen darauf in einer beliebigen Collection eines höheren Scopes ablegen.
@luker
ja, vielen Dank, jetzt sieht das schon viel besser aus
Allerdings habe ich immer noch Abweichungen von ~ 3 cm bezogen auf den Punkt an dem Maximal-Geschwindigkeit erreicht wird. Ich poste mal meinen Code, vielleicht ist die Reihenfolge der Befehle ungünstig. Man braucht 3 TextBoxen und ein Canvas mit rectangle (Canvas-Breite = 800 + rectangle-Breite).
Die Klasse ...
public class C_Shuttle : INotifyPropertyChanged
{
// Private Variablen
private Vector pos;
private Vector vel;
private Vector acc;
// Konstruktor
public C_Shuttle()
{
pos = new Vector(0, 0);
vel = new Vector(0, 0);
acc = new Vector(0.3, 0);
}
// Eigenschaften
public Vector Pos
{
get
{
return pos;
}
set
{
pos = value;
OnPropertyChanged("Pos");
}
}
public Vector Vel
{
get
{
return vel;
}
set
{
vel = value;
if (vel.X > 1)
{
Vel = new Vector(1, 0);
}
OnPropertyChanged("Vel");
}
}
public Vector Acc
{
get
{
return acc;
}
}
// Property changed Event
public event PropertyChangedEventHandler PropertyChanged;
// Functions
private void OnPropertyChanged(String property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
... und das Programm
public partial class MainWindow : Window
{
Stopwatch MainTimer = new Stopwatch();
DispatcherTimer RefreshTimer = new DispatcherTimer();
double t0, t1, dT;
C_Shuttle Shuttle = new C_Shuttle();
public MainWindow()
{
InitializeComponent();
this.DataContext = Shuttle;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Timer
RefreshTimer.Interval = TimeSpan.FromSeconds(0.02);
RefreshTimer.Tick += new EventHandler(RefreshTimer_Tick);
RefreshTimer.Start();
MainTimer.Start();
t0 = MainTimer.ElapsedMilliseconds;
// Bindings
Binding PosBinding = new Binding();
PosBinding.Path = new PropertyPath("Pos.X");
txtPos.SetBinding(TextBox.TextProperty, PosBinding);
Binding VelBinding = new Binding();
VelBinding.Path = new PropertyPath("Vel.X");
txtVel.SetBinding(TextBox.TextProperty, VelBinding);
}
private void RefreshTimer_Tick(object sender, EventArgs e)
{
t1 = MainTimer.ElapsedMilliseconds;
dT = (t1 - t0) / 1000;
t0 = t1;
if (Shuttle.Vel.X < 1)
Shuttle.Vel += Shuttle.Acc * dT;
Shuttle.Pos += Shuttle.Vel * dT + Shuttle.Acc * 0.5 * dT * dT;
// Bildschirm aktualisieren
Canvas.SetLeft(Rechteck, Shuttle.Pos.X * 100);
txtTime.Text = MainTimer.Elapsed.ToString();
//if (Shuttle.Pos.X >= 8)
if (MainTimer.ElapsedMilliseconds >= 3333.3333)
{
MainTimer.Stop();
RefreshTimer.Stop();
}
CommandManager.InvalidateRequerySuggested();
}
}
NullbockException schrieb:
Commands?? Sowas wie Button clicks?? das löst man mit IComannd implementationen..
Hast du überhaupt verstanden was er will?
@Parker
Du kannst die Commands durchaus binden. Ich bin nicht voll fit in WPF, aber ich glaube sowas in der Art könnte gehen:
<ItemsControl ItemsSource="{Binding Path=ViewModels, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<ItemContainerTemplate>
<Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=MyControl}, Path=DataContext.MyCommand}"><TextBlock Text="Execute" /></Button>
</ItemContainerTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
NullbockException schrieb:
ein service vll.!?
Ja, vermutlich. Aber wie kann man rausfinden welcher es ist?
NullbockException schrieb:
hast du überhaupt nen COM1? systemmanager
Ja, sie ist physikalisch vorhanden und steht im Systemmanager drin.
Gruß
Michael
Heureka ich hab es ... hatte heute morgen einen Geistesblitz!
public abstract class MessagePool<T>
{
[XmlIgnoreAttribute]
public virtual ArrayList m_messages { get; set; }
Der Deserialisierer scheint keine Überschriebenen Felder interpretieren zu können, ihn muss man das explizit mit XmlIgnoreAttribute nochmal verdeutlichen das dieses Feld Ignoriert werden soll
Manchmal tut es auch eine Runde schlaf
Danke euch für die Ratschläge
Morynnia schrieb:
ich will in meinem programm exception verwenden.
Exceptions verwenden ist nicht schlecht, ich befürchte nur das wenn ich deinen Text lese, das du eine falsche Vorstellung von Exceptions hast, und wofür man sie verwendet.
1. Exceptions sollte man nur für echte Fehler verwenden. Sprich etwas das bei dem normalen Programmablauf nicht vorgesehen ist. z.B. wenn eine Methode nur für Werte in einem bestimmten Wertebereich ausgelegt ist, aber ein Wert außerhalb dieses Bereiches übergeben wurde.
2. Eine Exception bricht den Programmablauf ab und springt dann zum nächsten passenden catch in der Aufrufreihenfolge. Somit können nicht mehrere Exceptions vorliegen, wenn überhaupt kann man Exceptions in anderen aufnehmen und weiterwerfen (InnerExceptions).
Beschreibe erst einmal was du _wirklich_ willst, ohne dich auf bestimmte Techniken (wie Exceptions) festzulegen, und fasse dies in eine verständliche Sprache. Dann können wir dir besser helfen.
Kleine Bitte: Auch meine Rechtschreibung ist nicht wirklich gut, aber etwas mehr Mühe wäre gut und hilft beim Lesen (Groß-/Kleinschreibung, Formulierung...).
Label kann nur "printable characters" darstellen. Tabulator ist kein solches Zeichen, während Linefeed ein solches ist. Ersetze den Tabulator durch die Anzahl Leerzeichen, welche du erwartest. Es ist nämlich nirgendwo definiert, wie breit ein Tabulator sein soll.
Grüssli
@KPC
Vieeeelen Dank, mir fällt ein Stein vom Herzen, jetzt kann ich endlich weitermachen
War ich ja schon nah dran, nur das children.add hat noch gefehlt. TextBlock ging bei mir nicht, aber mit TextBox geht's.
Und Du hast schon recht, langfristig werd ich um XAML wohl nicht rumkommen, vor allem weil die meisten WPF-Tipps im Netz im XAML-Format sind, da steht man als reiner C#-Coder etwas im Regen.
Grüsse
Das Weiterleiten von Nachrichten an subclasses - wie bei WinApi teilweise erforderlich - ist bei C# zum Abfangen solcher Nachrichten nicht notwendig. Dafür gibt es die sehr umfangreichen Möglichkeiten, eigene Ereignismethoden einzurichten und entscheidet dort, ob man das Ereignis selbst verarbeiten oder an die Standardverarbeitung weitergeben möchte. Trenne dich bei C# vom Denken in Nachrichten und denke nur noch in Objekten, Eigenschaften und Ereignissen. Beispiele: KeyPress, KeyDown für die Tastatur.
Und was ist jetzt das Problem? Ein Button hat eine Image Eigenschaft. Wenn das Bild einen transparenten Hintergrund hat (z.B. png), dann wird es auch entsprechend dargestellt.
JZieler schrieb:
Und wie kann ich das abfangen?
if (grid[j, i].Value != null)
{
}
-> Grundlagen lernen. Du hast null Plan, hantierst aber mit GUI, Datenbank und Excel-Export.
Der Destruktor muss immer über einen Funktionskörper verfügen - auch wenn du ihn als pure virtual deklarierst. Siehe auch diesen Thread.
Falsches Forum btw.. das ist ein reines C++-Problem.
Hallo,
warum lädt eine C# Exe automatisch eine DLL mit dem selben Namen, sobald sie zusammen in einem Ordner liegen?
Kann man Verhalten abstellen? Ich habe bei einem Projekt nämlich eine C++ DLL mit gleichem Namen wie die Exe. Diese DLL soll aber nicht von der EXE geladen werden.
greetz KN4CK3R