Laden...

Forenbeiträge von Quaneu Ingesamt 692 Beiträge

28.10.2010 - 10:04 Uhr

Hallo zusammen,

ich habe eine DataGrid, mit einer DataGridCheckBoxColumn und sonst nur DataGridTextColumns. Die DataGridTextColumns besitzen alle ein Binding, so dass sie die Informationen der Objekte aus der ItemsSource anzeigen. Nur das DataGridCheckBoxColumn besitzt kein Binding, da die Objekte dafür kein Property haben. Dies will ich aber per Code setzen, doch ich finde einfach keinen Weg auf die CheckBoxen in der DataGridCheckBoxColumn zuzugreifen (diese Splate ist immer am Anfang der Tabelle).

Daher meine Frage, gibt es eine Möglichkeit per Code dieCheckBoxen in DataGridCheckBoxColumn zu setzen?

Gruß
Quaneu

27.10.2010 - 16:53 Uhr

AvailableDimensions ist eine Auflistung von Objekten und die View ist das UserControl.
Das Binding klappt, also es kommen keinerlei Fehlermeldungen (auch nicht im Output).

Wenn ich z.B. in die zweite Zeile klicke, selektiert er immer die erste...

27.10.2010 - 13:58 Uhr

Hallo,
ich versuche mich gerade an dem DataGrid. Es klappt auch alles soweit ganz gut.
Doch wenn ich z.B. folgendes habe:


<DataGrid x:Name="Test" ItemsSource="{Binding ElementName=View, Path=AvailableDimensions}" AlternatingRowBackground="Gainsboro"  AlternationCount="2" AutoGenerateColumns="False" SelectionUnit="FullRow"  IsReadOnly="True">
   <DataGrid.Columns>
      <DataGridTextColumn Header="ShortName" Binding="{Binding Path=ShortName}"/>
      <DataGridTextColumn Header="LongName" Binding="{Binding Path=LongName}"/>
   </DataGrid.Columns>
</DataGrid>

Er zeigt auch alles wunderbar an, doch leider klappt das selektieren einer Zelle nicht, wenn ShortName oder LongName ein leerer String sind. Woran liegt denn das, bzw. wie kann ich dies umgehen. Selbst " " klappt nicht.

Viele Grüße
Quaneu

21.10.2010 - 11:26 Uhr

Hallo,

ich erzeuge ein PNG von meinem Canvas wie folgt:


SaveFileDialog _sd = new SaveFileDialog() { DefaultExt = "PNG" };
if (_sd.ShowDialog() == true)
{
   Point _poi = m_Layout.TranslatePoint(new Point(), m_scrollLayout);
   m_Layout.Background = Brushes.White;
   m_Layout.LayoutTransform = new RotateTransform(-90);
   RenderTargetBitmap _bmp = new RenderTargetBitmap((int)Math.Ceiling((m_Layout.ActualHeight * _scale)),   (int)Math.Ceiling((m_Layout.ActualWidth * _scale)), 96, 96, PixelFormats.Default);
   m_Layout.Arrange(new Rect(new Size(m_Layout.ActualHeight * _scale, m_Layout.ActualWidth * _scale)));
   m_Layout.LayoutTransform = new TranslateTransform(-_poi.X, -_poi.Y);
   _bmp.Render(m_Layout);

   m_Layout.Background = Brushes.AliceBlue;
   m_Layout.LayoutTransform = null;
   m_Layout.Arrange(new Rect(_poi, new Size(m_Layout.ActualWidth * m_ValueOverview, m_Layout.ActualHeight * m_ValueOverview)));
   PngBitmapEncoder _png = new PngBitmapEncoder();
   _png.Frames.Add(BitmapFrame.Create(_bmp));
   _png.Save(File.Create(_sd.SafeFileName));
}

Doch leider funktioniert dies nicht richtig... denn beim ersten m_Layout.Arrange wird die Größe meines Canvas nicht aktualisiert... und ich weiß einfach nicht warum.
Das komische ist auch, selbst wenn ich die Width und Height per Hand auf die Größe setze, passt es nicht auf das PNG.

Sieht jemand vielleicht meinen Fehler, da ich gerade echt auf dem Schlauch stehe...

Viele Grüße
Quaneu

15.10.2010 - 22:37 Uhr

Mir war das auch klar und ich habe nicht gefragt warum, sonder was ein besserer Weg sei.
Ich hätte wohl den umständlichten Weg gewählt, daher habe ich gefragt, ob es nicht einen besseren Weg gibt.

Vielen Dank für eure schnelle Hilfe.

15.10.2010 - 22:29 Uhr

@ gfoidl:
Also ich habe einen Style für TabItems, und diese Anzahl kann variable sein, daher müsste ich meine Properties dynamisch erstellen und für jedes 2 neue Properties erstellen, die eigentlich alle das selbe machen.

@talla:
Stimmt beides.
Bis jetzt ist der DataContext überall gleich also DataContext = this und die Bindung ist so wie von Dir vermutet.

Dann werde ich mich gleich mal daran machen die DataContexte richtig zu setzen.

15.10.2010 - 22:16 Uhr

Also ich habe einen impliziten Style, dieser wird daher von all meinen Controls verwenden. In dem Style bindet der ProgressBar an zwei Properties (ProgressValue und ProgressMaximum). Diese Properties werden nun durch meine "BackgroundWorker" aktualisiert mit dem unerwünschten Effekt (siehe oben), der mir auch völlig verständlich ist.

Nur frage ich mich, wenn ich z.B. 10 Controls mit diesem Style habe, bräuchte ich 20 Properties... daher hoffe ich, dass es einen besseren Weg wie meinen gibt.

Grüße
Quaneu

15.10.2010 - 21:57 Uhr

Hat wunderbar geklappt.

Nur hätte ich noch eine Frage. Ich habe nun ein meinem Style ein ProgressBar, diesen Style verwenden nun einige Controls.
Doch wenn nun mein BackgroundWorker den ProgressBar über Binding aktualisiert, werden nun alle ProgressBars aktualisiert, was auch völlig klar ist.

Muss ich jetzt für jedes Control einen eigenen Style schreiben, damit ich jeden ProgressBar gezielt ansteuern kann, oder gibt es einen eleganteren Weg?

15.10.2010 - 20:46 Uhr

Super vielen Dank für Deine Info. Werd ich gleich mal probieren.

Gruß
Quaneu

15.10.2010 - 19:59 Uhr

Hallo,
ich bastle mir gerade ein ControlTemplate, in dem ein ProgressBar vorkommen soll. Nun frage ich mich aber, wie ich diesen ansteuern kann. Dieser soll nämlich im ProgressChanged_Event meines BackgroundWorkers aktualisiert werden.
Doch ich weiß nicht wie ich auf diesen zugreifen kann.

Mit FindName bin ich leider auch nicht ans Ziel gekommen.

Viele Grüße
Quaneu

13.10.2010 - 13:49 Uhr

Ja. Sorry wollt ich eigentlich noch dazu schreiben.

Dann werde ich mal mein Möglichstes versuchen und dich auf dem Laufenden halten, falls ich was finde.

Gruß
Quaneu

13.10.2010 - 13:32 Uhr

Windows 7 Ultimate und 3,5 GB (3,25 GB verwendbar).

Gibt es denn dann keine Möglichkeit so große Controls als PNG abzuspeichern?

Ehrlich gesagt weiß ich das nicht genau, wie sie es dann machen, aber gewünscht war PNG.

13.10.2010 - 12:58 Uhr

Also ich hab grad in der msdn zu BitmapSource (RenderTargetBitmap ist davon abgeleitet) folgendes gefunden:

Die maximale Höhe und Breite eines Bilds beträgt 216 Pixel mit 32 Bit pro Kanal * 4 Kanäle.Die maximale Größe einer BitmapSource beträgt 232 Byte (64 Gigabyte), und die maximale Bildgröße beträgt vier Gigapixel.Die minimale Bildgröße ist 1x1.

Daher dachte ich, dass er mit meinem Canvas noch klar kommen müsste...

Mit Pbgra64 geb ich dir recht, war ein denkfehler meinerseits.

Anzeigen kann man es wirklich nicht mehr (nur über scrollen), doch man kann sie (so ist es vorgesehen) ausplotten um einen gesamten Überblick zu bekommen.

Fast hätte ich es vergessen, vielen Dank für euren schnellen Antworten.

Quaneu

13.10.2010 - 12:35 Uhr

Also z.B. 33500 x 39508 schafft er schon nicht mehr. Daher wolte ich auf Pbgra64 wechseln, doch das wird nicht unterstützt.

13.10.2010 - 11:45 Uhr

Hallo,

ich hätte eine Frage zu RenderTargetBitmap. ich würde gern mein Canvas als PNG abspeichern, dazu verwende ich folgenden Code:


Point _poi = m_Layout.TranslatePoint(new Point(), m_scrollLayout);
RenderTargetBitmap _bmp = new RenderTargetBitmap((int)(m_Layout.ActualWidth * m_ValueOverview), (int)(m_Layout.ActualHeight * m_ValueOverview), 96, 96, PixelFormats.Pbgra32);

m_Layout.Arrange(new Rect(new Size(m_Layout.ActualWidth * m_ValueOverview, m_Layout.ActualHeight * m_ValueOverview)));
                _bmp.Render(m_Layout);
m_Layout.Arrange(new Rect(_poi, new Size(m_Layout.ActualWidth * m_ValueOverview, m_Layout.ActualHeight * m_ValueOverview)));

PngBitmapEncoder _png = new PngBitmapEncoder();
_png.Frames.Add(BitmapFrame.Create(_bmp));

SaveFileDialog _sd = new SaveFileDialog() { DefaultExt = "PNG" };
if (_sd.ShowDialog() == true)
{
   _png.Save(File.Create(_sd.SafeFileName));
}

Dies klappt auch meistens ganz gut, doch wenn mein Canvas "sehr" groß wird, dann bekomme ich folgende Fehlermeldung:

Von den Bilddaten wurde bei der Verarbeitung ein Überlauf generiert.

Ich wollte schon PixelFormats ändern, doch wird das nicht unterstütz, bzw. alle Formate.

Daher meine Fragen, wie Groß darf das Bitmap (bzw. mein Canvas) max. sein und welche Formate kann man für RenderTargetBitMap nehmen?

Gruß
Quaneu

07.10.2010 - 13:17 Uhr

Bin leider erst jetzt dazu gekommen die DLL näher anzuschauen, doch leider passt sie für mich nicht so ganz. Da ich wirklich sehr große Tabellen erzeugen "muss" und die performance auch ein Rolle spielt.

Ich habe es jetzt nochmals mit einem FlowDocument probiert, das in einem FlowDocumentScrollViewer liegt, doch auch hier braucht die Erzeugung und das anzeigen einfach viel zu lange.

Weiß jemand wie man dieses Problem in den Griff bekommen könnte?

Grüße
Quaneu

30.09.2010 - 10:14 Uhr

Hallo,

ich habe ein Grid (A) mit zwei Zeilen, in der ersten ist ein Label das um -90° gedreht wird und in der zweiten Zeile in Image.
Dieses Grid (A) wird wiederum in ein Grid (B) gepackt und zwar hat das Grid (B) z.B. 20 Spalten und in jede wird ein Grid (A) gepackt.

Das Problem ist, dass das Grid (B) mein Label abschneidet, da wohl beim Rotate die Weite als Höhe verwendet wird. Diese steht überall auf * (somit sind alle gleich breit) und die Höhe auf Auto. Daher denke ich, dass er mein Grid (A) abschneidet.

Kann man dieses Verhalten irgendwie abstellen, falls meine Vermutung stimmt?

Grüße
Quaneu

29.09.2010 - 11:00 Uhr

Vielen vielen Dank für Deine schnelle Antwort, werde ich mir gleich mal anschauen.

Gruß
Quaneu

29.09.2010 - 08:40 Uhr

Hallo,

mich würde interessieren, wie ich sehr große Tabellen einerseits schnell darstellen kann und andererseits auch bequem ausdrucken kann.

Ich habe es mal mit einem FlowDocument (hier speziell Table) versucht, doch leider braucht dies bei der Erstellung recht lange und das schon bei "nur" 3000 Zeilen.
Mit einem Grid geht es viel schneller, doch ist das ausdrucken hier ein großes Problem.

Daher meine Frage, wie realisiere ich dies am besten bzw. welcher Container ist dafür am besten geeignet.

Gruß
Quaneu

24.09.2010 - 15:49 Uhr

Dann bastle Dir doch z.B. ein Grid mit zwei Spalten und setze in die erste ein Image und in die zweite deinen Link und das fügst du als Item deiner ListView bzw. deinem ListviewItem hinzu.

24.09.2010 - 15:35 Uhr

Image _image = new Image();
//...
_image.LayoutTransform = new RotateTransform(90); // wird um 90Grad gedraht;

24.09.2010 - 15:28 Uhr

Über Transform könntest es probieren.

24.09.2010 - 15:25 Uhr

Jetzt hätte ich noch eine Frage zu meiner Problematik.

Ich habe den Ansatz verfolgt:


m_Layout.LayoutTransform = new ScaleTransform(m_Value, m_Value, m_Layout.Width * m_Value / 2, m_Layout.Height * m_Value / 2);
m_Layout.Arrange(new Rect(_offset, new Size(m_Layout.Width * m_Value, m_Layout.Height * m_Value)));

Doch auch hier reagiert der ScrollViewer falsch, d.h. er zeigt fast nie die ScrollBars an, obwohl mein Canvas über die Ränder geht.

Woran kann denn dies liegen?

23.09.2010 - 09:57 Uhr

Ich soll also nur ein Event an das ListViewItem hängen. kommt dann ein DoubleClick soll ich nachsehen ob dieser Klick über einem Button war oder direkt auf das Item. Habe ich das richtig verstanden?

Ja, so wie Du es schon fast gemacht hast:


<ListView  x:Name="ImagesListView" ItemsSource="{Binding}"
                SelectionChanged="ImagesListView_SelectionChanged"
                MouseDoubleClick="OnDoubleClick">

Und in dem MouseButtonEventArgs von OnDoubleClick schaust Du wer dieses Event ausgelöst hat und reagierst dementsprechend darauf.

22.09.2010 - 14:13 Uhr

Du könntest NUR auf Diener ListView das MouseDoubleClick registrieren und dann MouseButtonEventArgs in der Source bzw. OrignalSource schauen wer dieses Event ausgelöst hat und dementsprechend handeln.

22.09.2010 - 13:33 Uhr

Die gibt es auch, aber wenn das Canvas ganz in den ScrollViewer passt, dann bringt das leider auch nichts.
Dies könnte man erst benutzen, wenn das Canvas "größer" als der ScrolViewer wird.

22.09.2010 - 13:12 Uhr

Anscheinend tut sich der ScrollViewer mit negativem Margin schwer. Aber dies kann man zum Glück umgehen.

Doch leider klappt das ganze immer noch nicht richtig.
Hie rmal mein Versuch:


double _OffsetX = -(e.GetPosition(m_Layout).X - m_Layout.Width / 2) * (m_Value - 1);
double _OffsetY = -(e.GetPosition(m_Layout).Y - m_Layout.Height / 2) * (m_Value - 1);

m_Layout.Margin = new Thickness(_test, _test2, 0, 0);

m_Layout ist mein Canvas, e ein MouseWheelEventArgs über die ich die Position der Maus abfrage. m_Value ist der Zoom-Wert (m_Value = 1 bedeutet Orginalgröße). m_Layout befindet sich wie schon erwähnt in einem ScrollViewer.

22.09.2010 - 12:17 Uhr

Der ScrollViewer will seinen Content immer zentrieren, daher muss ich mein Canvas verschieben, um die Maus an der selben Stelle zu behalten.
Jedoch stellt sich das verschieben schon als Problem heraus... denn wenn ich den Margin den Canvas ändere, kann ich das Canvas zwar verschieben, jedoch hat damit der ScrollViewer ein Problem (die ScrollBars erscheinen nicht mehr richtig).

Hatte nicht gedacht, dass das so einen "Aufwand" machen könnte...

22.09.2010 - 11:27 Uhr

Danke für Deine schnelle Antwort.

So habe ich es schon versucht, doch ich bekomm es einfach nicht hin 🤔
Mein Canvas, in das ich zoomen will befindet sich in einem ScrollViewer und ich denke der pfuscht mir dazwischen.

22.09.2010 - 11:14 Uhr

Hallo,
ich hätte eine Frage bzgl. zoomen.

Zoomen ist ja eigentlich ganz leicht umzusetzen, sei es mit Hilfe einer ViewBox oder LayoutTransform, doch wie schaffe ich es, dass man so zoomen kann wie in PDFs.
Also das ich mit dem Mauszeiger immer an der selben Stelle bleibe und alles darum "gezoomt" wird.

Viele Grüße

Quaneu

16.09.2010 - 13:49 Uhr

Werd ich mir gleich mal näher anschauen.

Danke schon mal dafür.

16.09.2010 - 13:43 Uhr

Hallo,
ich bin mir zwar nicht ganz sicher ob es klappen würde, aber Du könntest doch auch Dependency Properties nehmen und da kannst Du sagen ob neu gerendert werden soll. Des Weiteren kannst Du es dann auch Ziel eines Bindings benutzen usw.

Bitter verbessert mich, falls dies so nicht stimmt.

Gruß
Quaneu

16.09.2010 - 13:31 Uhr

Also es ist eine Art der Informationsdarstellung, fast wie eine Adjazensmatrix, jedoch mit mehr Informationen, und beim Scrollen sollen einige Spalten bzw. Zeilen immer fix bleiben. Daher müsste ich ein eigenes Control erstellen (denke ich).

Ich bräuchte eigentlich "nur" 100x100 Textblöcke, doch auch da tritt das Verhalten auf (was mir natürlich auch klar ist). Daher suche ich neue Wege...

16.09.2010 - 10:35 Uhr

Hallo,

ich habe im Forum schon einen Beitrag gefunden das sich mit dem Thema beschäftigt
(Optimierungsideen für die Darstellung von sehr vielen Controls?), jedoch leider nur für Forms.

Meine Frage ist aber nun, wie ich es am besten schaffe in WPF 100x100 UIElmente in einer Art Matrix darzustellen.

Mein erster Versuch war es ein Grid anzulegen mit 100 Spalten und Zeilen. Doch bei diesem Versuch dauert das laden sehr lange, genau so braucht das Fenster ewig um die Größe anzupassen.

Daher wollte ich fragen wie man dies in WPF am besten umsetzt.

Meine zweite Idee war es ein eigenes Panel zu entwickeln, doch wollte ich davor sicher gehen ob dies der beste Weg ist.

Viele Grüße

Quaneu

15.09.2010 - 15:25 Uhr

Ich muss jetzt leider diesen Thread nochmals bemühen...

Ich habe mich jetzt eingehend mit der WPF beschäftigt (so gut wie es mir möglich war). Aber ich verstehe leider immer noch nicht so recht wieso das nicht klappt...

Ich habe meine UserControls, die ich in ein Canvas packe, über Canvas.SetTop und Canvas.SetLeft positioniere.
Dann setzte ich die MinWidth und MinHeight meiner Objekte auf best. Werte, wenn ich diese neu zeichne setze ich sie wieder auf 0. Dies klappt auch in den meisten Fällen, doch es gibt Fälle, in denen die Größe (DesiredSize) nicht aktualisiert wird. Jedoch verstehe ich nicht warum. Denn es wird niemals die Width oder Height gesetzt.

Und das Canvas.SetLeft und Canvas.SetTop dürfte doch den Measure vom Canvas nicht beeinträchtigen... daher verstehe ich nicht was ich falsch mache.

Viele Grüße

Quaneu

08.09.2010 - 11:46 Uhr

Habs jetzt endlich geschafft:


FlowDocument _SignalFlow = new FlowDocument() {ColumnGap = 0, ColumnWidth=0};

Das Problem lag daran ,dass er immer zwei Spalten "erstellt" hatte. Dadurch hat er meiner Table nicht die ganze Breite zur Verfügung stellen können.

Gruß
Quaneu

08.09.2010 - 10:12 Uhr

Hallo,

ich will in einem Table Daten anzeigen. Dieser Table hat 3 Spalten, die auf die gesamte Seitenbreite "gestretcht" werden sollen.
Und genau dies stellt sich als Problem dar, denn egal was ich mache, er lässt sie immer gleich. Außer ich gebe eine fixe Weite ein. Doch genau dies will ich nicht, denn sie sollen immer so breit wie die Seite sein und diese ist abhängig von der Fensterbreite.
Folgendes habe ich schon alles probiert:


FlowDocument _SignalFlow = new FlowDocument() {ColumnGap = 0 };

...

Table _table = new Table() {CellSpacing = 10};
_table.Columns.Add(new TableColumn() { Width = new GridLength(1, GridUnitType.Star) });
_table.Columns.Add(new TableColumn() { Width = new GridLength(1, GridUnitType.Star) });
_table.Columns.Add(new TableColumn() { Width = new GridLength(1, GridUnitType.Star) });

Doch hat dies alles keine Auswirkungen auf die Spaltenbreite... sie bleiben so klein, das er immer den Text in den Spalten umbricht, wobei der Table nicht mal die halbe Seite ausfüllt.

Viele Grüße und schon mals vielen Dank
Quaneu

07.09.2010 - 10:38 Uhr

Hallo,
ich würde gern wissen wie ich den aktuellen DPI-Wert bestimmen kann. Ist dies wieder nur Über Forms möglich, da ich im Forum nur einen Beitrag dazu gefunden habe, jedoch bei Forms.

Ich benötige nämlich die aktuell DPI-Einstellung um von Pixel auf die logische Einheit zu kommen.

Gruß
Quaneu

04.09.2010 - 09:42 Uhr

Wenn Du wirklich nur den Bereich des Bildschirms willst, der nicht von der Taskbar oder anderen Desktop-Toolbars eingenommen wird, dann kannst du auch


SystemParameters.WorkArea

verwenden, dies liefert dir ein Rect mit allen Infos zurück.

Gruß
Quaneu

01.09.2010 - 21:24 Uhr

Dann werd ich dies gleich mit einbinden und anpassen bzw. erweitern.

Und nochmals vielen Dank.

Quaneu

01.09.2010 - 21:01 Uhr

Danke für die Tipps.

Doch hätte ich dazu gleich mal eine Frage.
SystemInformation.DoubleClickTime ist ja in der Assembly System.Windows.Forms, gibt es da auch was für WPF oder kann ich dies ohne bedenken einbinden?

Gruß
Quaneu

01.09.2010 - 20:45 Uhr

Habs jetzt endlich geschafft mit Hilfe des DispatcherTimer.

Hier meine Lösung:


public class BaseObject : UserControl
{
   private DispatcherTimer m_timer = new DispatcherTimer();
   private int m_counter = 0;


   public BaseObject()
   {
      m_timer.Tick += new EventHandler(Timer_Tick);
      m_timer.Interval = new TimeSpan(0, 0, 0, 0, 200);
   }

   public void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
   {
      m_counter++;
      m_timer.Start();
   }

   private void Timer_Tick(object sender, EventArgs e)
   {
      if (m_counter == 1)
      {
         // SingleClick
      }
      else if (m_counter == 2)
      {
          // DoubleClick
      }
      m_counter = 0;
      m_timer.Stop();
    }
}

Viele Grüße

Quaneu

01.09.2010 - 15:17 Uhr

So hatte ich es schon versucht (siehe oben), doch hat es leider nicht so geklappt...
Ich werde es jetzt mal mit einem DispatcherTimer versuchen.

Gruß
Quaneu

01.09.2010 - 11:55 Uhr

Ja hab ich. Er funktioniert auch tadellos. Jedoch ist er für meine Zwecke nicht der Richtige, da er vor einem DoubleClick auch ein SingleClick "feuert".

Analog dazu, ist in Windows ein DoubleClick immer 2 SingleClick.

Genau das ist ja mein Problem. Ich will eben bei einem DoubleClick wirklich nur dieses Event und nicht davor das SingleClick.

Nur weiß ich nicht wirklich wie ich das mit dem "warten" machen muss. Sleep ist doch schlecht, da meine ganze GUI sonst stehen bleibt.
Werde mir aber gleich mal Delay anschauen.

Viele Grüße
Quaneu

31.08.2010 - 11:34 Uhr

So wie ich den Code verstehe, würde aber auch bei einem "DoubleClick" davor einmal der "SingleClick" auslöst. Und dies will ich gerade nicht haben.

Gruß
Quaneu

31.08.2010 - 11:13 Uhr

Ich wollte das Problem jetzt wie folgt lösen, doch leider klappt das nicht wirklich so wie ich es mir vorgestellt habe...


private TimerCallback;
private m_counter = 0;
private bool m_IsSingleClick;
private bool m_IsDoubleClick;

public BaseObject()
{
   m_DoubleClickDelegate = new TimerCallback(DoubleClick);
}

private void DoubleClick(object State)
{
   if (m_counter == 1)
   {
      m_IsSingleClick = true;
      m_IsDoubleClick = false;
   }
   else if (m_counter == 2)
   {
      m_IsDoubleClick = true;
      m_IsSingleClick = false;
   }
   m_DoubleClickTimer.Dispose();
}

protected void Relations(object sender, MouseButtonEventArgs e)
{
   m_counter++;
   m_DoubleClickTimer = new Timer(m_DoubleClickDelegate, e.ClickCount, 500, 0);

   ...

   m_counter = 0;
}

Das Problem ist nämlich, dass DoubleClick in einem eigenen Thread läuft und ich daher auf diesen warten müsste doch dies klappt auch nicht.
Ich weiß einfach nicht wie ich es umsetzten kann, das nur "DoubleClick" oder nur "SingleClick" ausgeführt wird.

Gruß

Quaneu

28.08.2010 - 17:31 Uhr

Hallo,

ich habe ein UserControl mit einem einfachen MouseLeftButtonDown-Event und einen MouseDoubleClick-Event.
Ich würde aber gern beim MouseDoubleClick-Event nicht davor das MouseLeftButtonDown-Event auslösen, was im jetzigen Fall immer mitausgelöst wird.

Daher muss ich nur MouseLeftButtonDown-Event implementieren und selber auf MouseDoubleClick testen, doch leider finde ich dazu nichts passendes, nur für Forms habe ich etwas gefunden, doch für WPF leider nichts.

Hat dies vielleicht schon mal wer in WPF gemacht?

Gruß

Quaneu

26.08.2010 - 16:44 Uhr

Hallo,
ich nutze ein Thumb um mein UIElemnt zu verschieben, doch nun bin ich auf ein (für mich) sehr merkwürdiges Verhalten gestoßen.

Ich habe folgende Events für mein Thumb:

  1. OnDragstarted
  2. OnDragDelta
  3. OnDragCompleted

Beim OnDragstarted erzeuge ich einen Path und füge ihn meinem Canvas hinzu.
Bei OnDragCompleted will ich es wieder löschen. Dies klappt auch immer sehr gut. Doch wenn ich nun einen Doppelklick auf mein Thumb mache, bekomme ich die Fehlermeldung das es den Path nicht gibt...
Mache ich einen BreakPoint in OnDragstarted und debugge, klappt es wieder.

Nun frage ich mich wie sich dieses Verhalten erklären lässt. Ich sicher über eine Abfrage (== null) den Fehler vermeiden, doch ich würde es gern verstehen.

Viele Grüße
Quaneu

25.08.2010 - 15:14 Uhr

Ja die Schleifen sind aus meiner Test-Methode und rufen alle Projekte auf um diese zu laden und darzustellen. Falls dann Fehler auftreten, werden diese in ein Log-File geschrieben um zu sehen wo welcher Fehler aufgetreten ist.

Dann werde ich mal deinen Vorschlag mit dem eigenen Thread versuchen. also meine Test-Methode in einen eigenen Thread auslagern.

@gfoidl:
Dies habe ich schon probiert, jedoch habe ich hier den DeadLock "ausgelöst, den zommi beschrieben hat.

25.08.2010 - 14:51 Uhr

Also kann ich es so gar nicht testen, ohne mein Programm an den Test anzupassen (was eigentlich nicht der Fall sein sollte).
Oder gibt es noch eine weitere Möglichkeit?