Laden...
U
Benutzerbeschreibung
Konto auf Wunsch des Benutzers gesperrt

Forenbeiträge von userid14268 Ingesamt 1.578 Beiträge

07.07.2010 - 13:55 Uhr

Du solltest pro Datei und pro Verzeichnis ein Objekt haben das dieses repräsentiert (sonst wird man ja Blöde).
In diesem Objekt kannst du ein IsExpanded Property erstellen.
In der Xaml dann, bindest du über den ItemContainerStyle das IsExpanded des TreeViewVitem gegen das IsExpanded des Objekts.

07.07.2010 - 12:04 Uhr

Stellen alle in einem XAML-Objekt untergeordneten in <>Klammer stehende Ausdrücke, Methoden/Eigenschaften des übergeordneten Objektes dar?

Kommt darauf an was das Control als ContentProperty definiert hat.

Alle Controls haben die Properties als DepencencyProperty definiert, sodass sie auch in Xaml ansprechbar sind.
Und im Klassen Header wird dann mit dem "ContentProperty" definiert welches Property das innere ist.

Bei einem Button (zb im ContentControl) steht also

[ContentProperty("Content")]
class ContentControl :

darum kann man schreiben

<Button Content="Bla" /> oder
<Button>Content</Button>
geht beides auf das Property "Content"

07.07.2010 - 10:09 Uhr

Genau das nach bilden was du in xaml machst.

Pseudo:

TextBlock block = new TextBlock();
block.Inlines.Add(new Run("Dies ist ein normaler test, "));
block.Inlines.Add(new Bold(new Run("dieser dagegen unterstrichen")));

Siehe auch: http://msdn.microsoft.com/en-us/library/system.windows.controls.textblock.aspx

07.07.2010 - 08:44 Uhr

Ich kann dir zwar bei deinem Problem nicht helfen, da ich keine Ahnung von Webcams in WPF habe, nur was ich weiß ist, das "funktioniert nicht" immer eine sehr gute Fehlerbeschreibung ist 😄

07.07.2010 - 08:26 Uhr

New Feature: Ausgewählten Artikel als gelesen markieren.

Because: Wenn mich ein Artikel nicht interessiert, will ich ihn so als gelesen markieren ohne ihn zu öffnen, bisher geht das nur mit "Alle Feeds als gelesen markieren", aber das will man nicht immer, und diese Methode dauert recht lange.

06.07.2010 - 13:59 Uhr

Hi,

Bei dem Merken der gelesenen Feeds habe ich anscheinend zu kompliziert gedacht, so wie du das beschreibst macht das eindeutig mehr Sinn ^^ Das werde ich dann entsprechend ändern.

Kommt dann bald ein Update?

Wir müllen den Thread ganz schön zu, ein IssueTracker wäre angemessen 😄

06.07.2010 - 07:55 Uhr

Bei sovielen Artikeln ist das nicht verwunderlich. Der feedCarrier muss sich ja merken was du schon gelesen hast. Dafür gibt es aber Cleanup-Funktionen die man in den Einstellungen aktivieren kann damit dies auf einem überschaubarem Level bleibt.

Irgendwie spinnt es nun rum, scheint zumindest so.

Ich habe in den Settings eingestellt das nur die letzten 10 behalten werden sollen.
Danach auf aktualisieren geklickt, aber alle Artikel sind weiterhin da.

Nun starte ich den feedCarriier neu, sobald ich das Fenster anzeigen lasse sind alle Feed titel (Hauptgruppe) abgeschnitten, und nun sind wieder alle Feeds als ungelesen markiert (553 Artikel)

Bei mir ist es nun so, sobald ich den feedCarrier neu starte, werden nur pro Feed die letzten 10 als ungelesen markiert, aber alle anderen nicht.
So kommt es das ich nach jedem Start des feedCarrier 220 gelesene Artikel habe aber 553 ungelesene.

D.H. die Funktion "Artikel nach bestimmter Anzahl löschen" ist unbrauchbar, und auch in der aussage falsch, es wird doch nichts gelöscht.

Auch "Artikel nach bestimmten Datum löschen" ist unbrauchbar, ich habe es auf 7 Tage gestellt, in der annahme das alles was älter ist pauschal als gelesen markiert wird.

Dem ist aber nicht so, es werden nur die Artikel als gelesen markiert die genau 7 Tage alt sind, neuere (von heute) und die noch älter sind, werden alle immer als Ungelesen markiert sobald die Applikation gestartet wird.

05.07.2010 - 15:29 Uhr

Hi,

Ja, auch ein Neustart bringt keine Änderung.
Habe derzeit aber keine neuen Feed Einträge, weiß nicht ob es überhaupt noch funktioniert.

Entschuldigen brauchst du dich nicht 😉 Sowas kommt vor.
Hast to ein IssueTracker wo man Reporten kann und den stand der Tasks einsehen?

Ich weiß nicht ob diese Information weiter hilft, die feedCarrier.Settings.xml Datei ist bei mir 290KB groß.

Feature Idee, eine "About" in den ContextMenu des Icons, und in diesem About ein "Check for Updates", evtl auch ein "Check for Updates" direkt ins ContextMenu.

05.07.2010 - 14:35 Uhr

Super Arbeit 😃

Noch offene ToDo:

  1. Die ToolTips haben ein Bug, diese sind immer hinter der Liste, sieht man auf den Screenshot auch. Dadurch sind die ToolTips nutzlos.
  2. Wenn man die Artikelübersicht geöffnet hat und man hat später ein anderes Fenster darüber, kann man es nicht in den Vordergrund holen, man muss dann mit Alt+Tab zu dem Fenster wechseln.
  3. Gleichzeitiges öffnen mehrerer Feeds (Multiselect + Enter) wär praktisch
  4. Die Feeds sollten nach den Anzeigename sortiert sein, bei ~20 Feeds wird es schnell unübersichtlich
  5. Beim Refresh der Feeds sollte die Liste nicht geleert werden, sodass man beim Refresh noch Feeds durch sehen kann. (Eine schnelle Lösung währe erst ein Clean up nachdem alles geholt wurde, nicht vorher)

Was ich noch fragen wollte, gibt es ein generelles Performance problem?
Ich habe 22 Feeds und ein Refresh dauert gemessene 28 Sekunden, finde ich ein bisschen lang, kann es daran liegen das alle Feeds ein PW brauchen?
Punkt 5 ist dabei auch interessant, das die Liste erst geleert wird sobald neue Ergebnisse vor liegen.

Ich hatte im übrigen noch ein komisches Phänomen, weiß aber nich woran es gelegen haben könnte.
Ich hatte feedCarrier die ganze zeit im Hintergrund aktiv und bekam alle 30 Minuten ein Popup mit "Es gibt 537 ungelesene Feeds" (habe es auf 30 min gestellt)
Als ich vorhin, zwecks des Updates das Fenster wieder anzeigen ließ, waren alle Expander weg, und auch keine Anzeige wie viele ungelesene Feeds, als wenn alle informationen weg wären.

EDIT1: Kleines Issue.

Alle als gelesen markieren funktioniert erst wenn man zuerst das Item auswählt und dann Rechtsklick macht, direkt rechts klick auf ein anderes Item um dessen stand zurück zu setzen funktioniert nicht.

Achso und sobald etwas als gelesen markiert wurde sollte der Text " *** (0 Neu) entfernt werden, bei den feeds die schon vollständig gelesen waren war dieser Text bereits weg
habe nun
"AAA"
"BBB (0 Neu)"
"CCC"

EDIT2: Mein feedCarrier scheint nicht mehr zu funktionieren, nachdem ich alle Feeds als gelesen markiert habe gibt es folgendes Phänomen.
Wenn das Fenster offen ist und ich auf den Aktualisieren Button Klicke, wird die Liste geleert und diese Wait icon angezeigt, aber es passiert nicht mehr, die CPU ist bei null und auch nach mehreren Minuten erscheint kein Inhalt.

Sobald ich das Fenster nun schließe und wieder öffne werden die Feeds wieder angezeigt, nun aber mit abgeschnittenen Text.

05.07.2010 - 13:44 Uhr

Genau das hatt VS ja nicht gemacht.
Alle Dateien sind in verschiedenen Namespaces eingeteilt, und das auch verschieden tief, aber das durch den Wizard erstellte Test Projekt hat alle Test Dateien im Root, und auch nur das Root Namespace des Projektes wurde verwendet -.-

Ich habe ein Test Projekt gemacht, da ist es so (Namespaces sind auch gleichzeitig Verzeichnisse)

<Pfad> (<Namespace>)

Demo.csproj
Demo\App.xaml.cs (Demo)
Demo\MainWindow.xaml.cs (Demo)
Demo\Properties\AssemblyInfo.cs (-)
Demo\Properties\Resources.Designer.cs (Demo.Properties)
Demo\Properties\Settings.Designer.cs (Demo.Properties)
Demo\SubFolder\SubFolderClass.cs (Demo.SubFolder)

Nun sag ich VS das er über den Wizard ein UnitTest projekt erstellen soll, VS erstellt dann folgendes:

Demo.Test.csproj
Demo.Test\AppTest.cs (Demo.Test)
Demo.Test\MainWindowTest.cs (Demo.Test)
Demo.Test\Properties\AssemblyInfo.cs (-)
Demo.Test\ResourcesTest.cs (Demo.Test)
Demo.Test\SettingsTest.cs (Demo.Test)
Demo.Test\SubFolderClassTest.cs (Demo.Test)

Man sieht das SubFolderClassTest nicht nur im falschen Verzeichnis liegt sondern auch ein falschen Namespace hat.

Bisher ist es so, das sobald ich ein neuen UnitTest erstelle, ich ihn in den Namespaces noch verschieben und anpassen muss.

05.07.2010 - 11:35 Uhr

Dankeschön.

Eine Frage hatte ich beim Start Posting vergessen.

Wie ist das mit den Namespaces? Wenn VS mit Dateien erstellt, werden alle Tests in den Root gepackt, wäre es nicht praktischer wenn die Test Dateien in den selben Namespaces liegen?

05.07.2010 - 10:34 Uhr

Angenehm, werds auf jeden fall verwenden.

Habe nun ein paar anmerkungen, bzw wünsche:

  1. Durch Resizig ist es möglich das Fenster zu verschieben, wenn man das schon machen kann wäre ein normales Drag&Drop verschieben praktisch
  2. Ein "Alles als gelesen markieren" fehlt definitiv, muss nun über 300 Feeds als gelesen Markieren.
  3. Zeigen eines Artikels sollte auch mit Enter möglich sein, bisher muss man immer doppelt klicken
  4. Die ToolTips haben ein Bug, diese sind immer hinter der Liste, sieht man auf den Screenshot auch. Dadurch sind die ToolTips nutzlos.
  5. Wenn man die Artikelübersicht geöffnet hat und man hat später ein anderes Fenster darüber, kann man es nicht in den Vordergrund holen, man muss dann mit Alt+Tab zu dem Fenster wechseln.
  6. In Alt+Tab fehlt das Icon (Das exe Icon sollte das selbe sein wie im Tray)
  7. Gleichzeitiges öffnen mehrerer Feeds (Multiselect + Enter) wär praktisch
  8. Die Feeds sollten nach den Anzeigename sortiert sein, bei ~20 Feeds wird es schnell unübersichtlich
  9. Beim Refresh der Feeds sollte die Liste nicht geleert werden, sodass man beim Refresh noch Feeds durch sehen kann. (Eine schnelle Lösung währe erst ein Clean up nachdem alles geholt wurde, nicht vorher)

// 8 und 9 angefügt

Punkt 2 ist am wichtigsten, ich habe derzeit 549 ungelesene Feeds, die müssen nun gesetzt werden.

05.07.2010 - 09:46 Uhr

Ich arbeite mich derzeit endlich in UnitTests ein und hätte direkt ein paar kleine Fragen.

  1. Ich habe eine Solution mit 4 Projekten, sollte ich auch 4 test Projekte machen?
  2. Die Projekt Namensgebung mach ich immer "<2Test>.Test" - angemessen?
  3. Klassen benenne ich immer <Name>Test - ok?
  4. Wie benennt man die Methoden am besten? Ich schreibe bisher immer den namen der zu testende Methode und was erwartet wird in den titel, z.B.:
private class NumberGeneratorTest
{
    [TestMethod]
    private void Generate_CreatesANumberGenerator()
    {
        NumberGenerator generator = NumberGenerator.Generate();
        Assert.IsNotNull(generator, "The NumberGenerator wasn't generated properly");
    }

    [TestMethod]
    private void Next_ReturnsNumberBelow5()
    {
        NumberGenerator generator = NumberGenerator.Generate();
        int generatedNumber = generator.Next();
        Assert.IsTrue(generatedNumber < 5, "The generated number is bigger then 5");
    }
}

Oft sehe ich auch einfach ein NextTest(); also die selbe Namensgebung wie bei der Klasse. Wenn man das tut, wie benennt man unterschiedliche cases der selben Methode?

  1. Wie verträgt es sich mit DRY? z.B. wenn ich Next_ReturnsNumberBelow5 mit einer anderen Zahl aufrufen will.
  2. Wie findet ihr die Syntax des Codes in Punkt 4?

LG
CSL

05.07.2010 - 09:32 Uhr

DateTime.AddMonths Method
Beim abziehen einfach ein negativen wert übergeben.

04.07.2010 - 11:58 Uhr

:::

:::

<DataTemplate x:Key="myCellTemplateMonth">  
  <DockPanel>  
    <TextBlock Foreground="DarkBlue" HorizontalAlignment="Center">  
      <TextBlock.Text>  
        <Binding Path="Month"/>  
      </TextBlock.Text>  
    </TextBlock>  
  </DockPanel>  
</DataTemplate>  

:::

<GridViewColumn Header="Month" Width="80"  
      CellTemplate="{StaticResource myCellTemplateMonth}"/>  

Was kann man da nicht verstehen?

Ohne die MSDN wirst du nur langsam voran kommen und viele unnötige Fragen in Foren stellen.

Und das Sortieren wenn ich es wie du da geschrieben hast mache funktioniert nichts davon mehr aber ist ja auch egal, so wie das Sortieren da aktuell drin ist tut es das was es soll und das reicht mir als Anfänger in C# erstmal 😉

Du musst natürlich den C# Code noch anpassen.
=> Auch Anfänger können derart Redundanz vermeiden 😉
Schau mal, selbst in der MSDN steht wie man eine ListView Sortiert: http://msdn.microsoft.com/de-de/library/ms745786(v=VS.90).aspx
//Dazu
Mein Vorschlag, leite eigenen GridViewColumns ab und erweitere es durch ein DependencyProperty, das kannst du dann statt des Headers im Code lesen.

04.07.2010 - 09:04 Uhr

Funktioniert nicht weil dein Code auch falsch ist, mal in die MSDN geschaut was die zum CellTemplate sagen?
Da ist unten direkt ein Beispiel: http://msdn.microsoft.com/en-us/library/system.windows.controls.gridviewcolumn.celltemplate.aspx.

Hier mal Pseudo:

<ListView x:Name="lvErrors" SelectionMode="Single" ItemsSource="{Binding ElementName=This, Path=ErrorCollection}" GridViewColumnHeader.Click="ListViewHeader_Click">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="25">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Source="{Binding IconURL}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Width="30" DisplayMemberBinding="{Binding Number}" />
            <GridViewColumn Width="420" Header="Beschreibung" DisplayMemberBinding="{Binding Statemant}" />
            <GridViewColumn Width="120" Header="Datei" DisplayMemberBinding="{Binding Data}" />
            <GridViewColumn Width="50" Header="Zeile" DisplayMemberBinding="{Binding Row}" />
            <GridViewColumn Width="50" Header="Spalte" DisplayMemberBinding="{Binding Colum}" />
        </GridView>
    </LisView.View>
</ListView>

Was die Sortierung an geht, du fängst halt in jeder Column den Klick, und das ist einfach unnütz. Fange einfach den Column klick direkt in der ListView, die masse an Redundanz ist doch nicht mehr nett an zu sehen.

Dein Code so wie er jetzt ist könnte viel einfacher gemacht werden.
Es gibt auch schon fertige ListView Controls welche eine Sortierung fest eingebaut haben 😉
Z.B.: http://downloads.my-libraries.de/Libraries/Tulipa/Documentation/html/T_Tulipa_EnhancedListView.htm

// Sollte öfter lesen vor dem absenden 😁

03.07.2010 - 18:54 Uhr

DisplayMemberBinding zeigt nur Text.
Überschreibe das CellTemplate vom GridViewColumn und setz dort im DataTemplate ein Image, dort kannst du dann Source binden.

PS. Um den HeaderClick zu bekommen kannst du auch ein AttachedProperty nehmen, brauchst du nicht überall setzen.
<ListView GridViewColumnHeader.Click="myeventhandler">
Zum sortieren einer ListView gibt es im netz viele gute Anleitungen 😉

03.07.2010 - 13:04 Uhr

Ja das ist WPF.
In XP, so kenne ich das, wird es so sein das der Border zwar grau ist, aber nur 2 Pixel breit.

Ich werde es am Montag einfach mal ausprobieren 😃

02.07.2010 - 21:47 Uhr

Hei das ist ja Praktisch, kann ich derzeit gut brauchen 😃

Zwei Fragen aber vorne weg, ich würde es ab Montag in der Firma verwenden wollen -

  1. Besteht die Möglichkeit das XP Style nach zu holen? (Man kann auch Pauschal das Vista/Sevenauch unter XP erzwingen 😉
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
</Application.Resources>
  1. Können RSS Abonniert werden welche User Name und Passwort benötigen?
01.07.2010 - 13:57 Uhr

Habs.

Das ist ein Problem des Message Loops, Hide und ShowDialog(); werden im EventHandler aufgerufen, und das Fenster kann erst korrekt zerstört werden bis alle Messages abgearbeitet sind, also erst sobald ShowDialog fertig ist, ist der EventHandler am ende.

Lösung:

public partial class App : Application
{
    private DispatcherTimer _waitTimer;
    private DemoWindow _window;

    public App()
    {
        ShutdownMode = ShutdownMode.OnExplicitShutdown;

        _waitTimer = new DispatcherTimer();
        _waitTimer.Interval = TimeSpan.FromSeconds(3);
        _waitTimer.Tick += new EventHandler(Timer_Tick);
    }

    protected override void OnStartup(StartupEventArgs e)
    {
        _window = new DemoWindow();
        _waitTimer.Start();
        _window.ShowDialog();
        base.OnStartup(e);
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        _waitTimer.Stop();
        _window.Close();
        Dispatcher.BeginInvoke(new Action(delegate
        {
            new MainWindow().ShowDialog();
            Shutdown();
        }));
    }
}

//Tag vergessen

01.07.2010 - 12:14 Uhr

Ich konnte das Problem reproduzieren und habe für euch eine kleine Demo Applikation:

http://downloads.my-libraries.de/MovingFailDemo.zip

Sobald die Applikation Startet wird ein Fenster für 3 Sekunden angezeigt, dann zerstört und das Hauptfenster erscheint.

Wenn man das Fenster verschiebt während es zerstört wird, ist das Hauptfenster dann nicht mehr benutzbar. Bei mir geht es sogar soweit das ich die Windows Startleiste und VS nicht mehr anklicken kann.

  • Applikation Starten
  • Das Kleine Fenster so lange verschieben bis es verschwindet
  • Versuchen das Hauptfenster zu bedienen.

Der Code besteht nur aus zwei einfachen Fenstern ohne Besonderheit, und die Startprozedur ich folgende:

public partial class App : Application
{
	private DispatcherTimer _waitTimer;
	private DemoWindow _window;

	public App()
	{
		ShutdownMode = ShutdownMode.OnExplicitShutdown;

		_waitTimer = new DispatcherTimer();
		_waitTimer.Interval = TimeSpan.FromSeconds(3);
		_waitTimer.Tick += new EventHandler(Timer_Tick);
	}

	protected override void OnStartup(StartupEventArgs e)
	{
		_window = new DemoWindow();
		_waitTimer.Start();
		_window.ShowDialog();
		base.OnStartup(e);
	}

	private void Timer_Tick(object sender, EventArgs e)
	{
		_waitTimer.Stop();
		_window.Close();
		new MainWindow().ShowDialog();
		Shutdown();
	}
}

Jemand eine Idee?

01.07.2010 - 11:14 Uhr

Ich lerne seit letzten Samstag Fahrrad fahren 🙂 Sonst mach ich nix 😁

01.07.2010 - 08:27 Uhr

Das ist auch richtig, die Methoden die von dem FileSystemWatchers aufgerufen werden sind in dem eigenen Thread, um dann etwas in der UI zu machen muss man es dann explizit Invoken.

30.06.2010 - 16:14 Uhr

Wie wäre es mit Methode DoDragDrop in der DragDrop Klasse?
DragDrop.DoDragDrop

PS: How can I drag and drop items between data bound ItemsControls?

24.06.2010 - 14:34 Uhr

Also ich bezahle pro Monat 9-35ct im durchschnitt, meine höchste Rechnung im gesamten letzten Jahr war ~2,50€ 😉

24.06.2010 - 09:05 Uhr

Haste mal geschaut wo AddHandler und RemoveHandler definiert sind? Ich vermute bei FrameworkElement oder UIElement, deine Klasse muss von dem entsprechenden Object ableiten.

24.06.2010 - 07:38 Uhr

Der DispatcherTimer ist nun mal in einem eigenen Thread, nach aufrufen von dt.Start(); läuft die Methode selbstverständlich weiter.
Wenn es dort warten würde, würde deine Applikation einfrieren, d.h. du brauchst von dem DispatcherTimer eine Information wenn es fertig ist => Ereignisbasierend => Events.

23.06.2010 - 19:10 Uhr

Wäre es nicht vielleicht einfacher herauszufinden warum das Fenster wenn es beim Verschieben versteckt wird dannach nicht mehr verschoben werden kann. Oder hast du da schon sehr viel Zeit investiert ohne Erfolg?

Bisher habe ich da nur sehr wenig Zeit investiert, bisher leben wir einfach damit.
> Ich habe kein Ansatz wie ich das Debuggen könnte, das ist ein ganz normales Windows ohne eine Modifikation.

Eine Idee?

23.06.2010 - 15:59 Uhr

>> MouseDown[Up][Move]
Das Fenster hat aber eine Titlelleiste, dort wird das [Preview]MouseDown etc. nicht gesendet, das kommt nur wenn man in den Client bereich ist.

>> SizeChanged
Und was bringt mir ein SizeChanged? Das wird abgesetzt wenn es gerade verschoben wurde, man weiß dadurch nicht ob es noch beim verschieben ist, ein SizeChanging gibt es ja nicht.

private _isDragging;
private OnSizeChanged()
{
    _isDragging = true; // or false?
    // when _isDragging can set to false or true?
}

>>Warum hidest Du das Fenster nur?

  1. Erhaltung der Letzten Position und Größe,
  2. Beim erstellen des Fensters muss einiges gemacht werden, sei es TextBoxen, ProgressBars, [De]Abonnieren diverser Events bis hin zum erstellen eines DispatcherTimers.
    Manche Aktionen können von 0.5 sek bis 5 Tage andauern, d.h. es kann problemlos dazu kommen das das Fenster mindestens 10x pro Sekunde zerstört und wieder erstellt werden muss.

Darum gibt es nur ein PleaseWait Fenster über die gesamte Programmlaufzeit.

23.06.2010 - 14:28 Uhr

Hi,

Es geht darum, ich habe ein PleaseWait Fenster welches der User verschieben kann.
Dieses Fenster wird vom Code heraus aufgerufen und auch wieder geschlossen (versteckt). Der User kann das Fenster selber nicht schließen.

Nun kann es aber Passieren das das Fenster versteckt wird während der User es verschiebt, sobald das Passierte und das Fenster wieder angezeigt wird, kann es nicht mehr verschoben werden.

Gibt es irgendwie eine Möglichkeit zu ermitteln ob ein Fenster gerade verschoben wird?

LG
CSL

22.06.2010 - 22:18 Uhr

Erstell ein Event, und in der dt_Tick Methode sendest du das Event sobald es die 5 ereicht, und im Eventhandler ist dann der Code

Pseudo:

private DispatcherTimer dt;
private event EventHandler FiveReached;

public Window1()
{
    InitializeComponent();

    dt = new System.Windows.Threading.DispatcherTimer();
    dt.Interval = new TimeSpan(0, 0, 0, 0, 1000); // 500 Milliseconds
    dt.Tick += new EventHandler(dt_Tick);
    FiveReached += new EventHandler(FiveReachedMethod);
}

void dt_Tick(object sender, EventArgs e)
{
    if (count < 5)
    {
        count++;
        label1.Content = count.ToString();
    }
    else
    {
        dt.Stop();
        label1.Content = "Timer stop";
        EventHandler handler = FiveReached;
        if (handler != null)
        {
            handler(this, EventArgs.Empty());
        }
    }
}

private void button1_Click(object sender, RoutedEventArgs e)
{
    dt.Start();
}

private void FiveReachedMethod(object sender, EventArgs e)
{
    // do anything
}
18.06.2010 - 07:44 Uhr

Das ContextMenu ist nicht im selben Visual Tree, ich vermute er kann das Binding nicht auflösen.
Google einfach nach "ContextMenu Binding".

Vorher schau in den VS Output, da steht wenn ein Binding nicht funktioniert.

17.06.2010 - 10:31 Uhr

Da aber Strings abgefragt werden dürfte in der IEnumerable keine Referenzen auf die COM Objekte vorhanden sein.

So wie meine jetzige Implementation ist dauert es keine Sekunde bei ~ 9000 Objekten, ich bin zufrieden 😃

17.06.2010 - 07:45 Uhr

Das erklärt es, vielen Dank.

16.06.2010 - 22:07 Uhr

Du meinst also wenn ich sage

IEnumerable<string> toUse = items.Select(i => i.Property).Distinct();
Items.AddRange(toUse.Select(t => new ChooseItem(t)));

wird das Statement erst beim AddRange ausgewertet?

Interessant.

Ich werde morgen mal das
List<string> toUse = new List<string>();
toUse.AddRange(items.Select(i => i.Property).Distinct());
außerhalb eines Workers machen, der Profiler ist da nicht ganz durchsichtig wenn es im Worker Thread ist.
Wenn dem so ist wie du sagst habe ich die Last einfach nur vom Ctor in den Worker verschoben.

16.06.2010 - 20:56 Uhr

Wie kann ich da nach sehen?
Es ist der normale IEnumerable der von Linq erzeugt wird. .Net 4.0

Mit Reflector bin ich bis zu dieser Methode gekommen:

[DebuggerHidden]
IEnumerator<TResult> IEnumerable<TResult>.GetEnumerator()
{
    Enumerable.<CastIterator>d__aa<TResult> _aa;
    if ((Thread.CurrentThread.ManagedThreadId == this.<>l__initialThreadId) && (this.<>1__state == -2))
    {
        this.<>1__state = 0;
        _aa = (Enumerable.<CastIterator>d__aa<TResult>) this;
    }
    else
    {
        _aa = new Enumerable.<CastIterator>d__aa<TResult>(0);
    }
    _aa.source = this.<>3__source;
    return _aa;
}

Wie man sieht wird da auch mit Thread IDs rum gemacht, eventuell war meine Vermutung richtig mit der überfürhung in einem anderen Thread, wobei ich es, wie gesagt, nicht reproduzieren kann.

Die Properties sind im übrigen Strings welche von einem interop COM Objekt abgefragt werden, aber ich nehme an das hat damit nichts zu tun da ja am ende nur die Strings verwendet werden.

16.06.2010 - 20:11 Uhr

Anmerkung

In einer kleinen Test Anwendung schaff ich es nicht es zu reproduzieren, und in der eigentlichen Anwendung wird das IEnumerable<string> (jetzt List<string>) auch in einem Worker gemacht, evtl ist das Problem das es von dem Worker Thread über das e.Result in den UI Thread gebracht werden muss, und das ist bei einem IEnumerable langsamer?

16.06.2010 - 19:51 Uhr

Folgendes

Ich habe auf arbeit eine App mit einem Filter Feature, der Filter wird damit die UI nicht einfriert in einem eigenen Thread ausgeführt (bei ~200.000 Objekten kann das dauern).

Nachdem ich es soweit fertig hatte und die ersten Tests liefen stellte ich fest das die UI immer noch einfriert, eine kurze Recherche brachte zu tage das es einfriert noch bevor der Filter überhaupt anfängt, und zwar bei dem hinzufügen der Objekte in eine Collection für die UI.

Nun zum Ablauf.

Ich habe eine liste von Objekten und brauche daraus eine liste von Strings welche dann für den Filter in einem Fenster angezeigt wird.

// Start des filters
void OnRunFilter(List<Item> items)
{
    IEnumerable<string> toUse = items.Select(i => i.Property).Distinct();
    ChooseWindow chooser = new ChooseWindow(toUse);
    if (chooser.ShowDialog() == true)
    {
        // Filter in einem Worker Thread
    }
}

class ChooseWindow : Window
{
    public ChooseWindow(IEnumerable<string> toUse)
    {
        Items = new EnhancedObservableCollection<ChooseItem>();
        Items.AddRange(toUse.Select(t => new ChooseItem(t)));
    }

    public EnhancedObservableCollection<ChooseItem> Items { get; set; }
}

Ich habe also nun mal den Profiler an geschmissen und musste feststellen das die meiste Zeit bei:

Items.AddRange(toUse.Select(t => new ChooseItem(t)));

verbraten wird, obwohl es in meinem test nur 20! Items sind. Wenn ich

foreach (string item in toUse)

mache
zeigt mit der Profiler das die zeit in dem "in" verbraten wird.

Die UI hängt an der stelle bei nur 20! Items bis zu 30 Sekunden lang.

Ich habe darauf hin das toUse von IEnumerable<string> zu List<string> gewechselt:

void OnRunFilter(List<Item> items)
{
    List<string> toUse = new List<string>();
    toUse.AddRange(items.Select(i => i.Property).Distinct());
    ChooseWindow chooser = new ChooseWindow(toUse);
    if (chooser.ShowDialog() == true)
    {
        // filter
    }
}

class ChooseWindow : Window
{
    public ChooseWindow(List<string> toUse)
    {
        Items = new EnhancedObservableCollection<ChooseItem>();
        Items.AddRange(toUse.Select(t => new ChooseItem(t)));
    }

    public EnhancedObservableCollection<ChooseItem> Items { get; set; }
}

Nun dauerte der Aufruf von

Items.AddRange(toUse.Select(t => new ChooseItem(t)));

unter eine Sekunde!

Wenn ich

List<string> toUse = items.Select(i => i.Property).Distinct().ToList();

mache, dauert diese Aufruf auch 30 Sekunden. Nur das AddRange schaffte Abhilfe.

Zusammenfassend:

IEnumerable<string> toUse = items.Select(i => i.Property).Distinct();
Items.AddRange(toUse.Select(t => new ChooseItem(t))); // dauert 30 sekunden

List<string> toUse = items.Select(i => i.Property).Distinct().ToList(); // dauert 30 sekunden
Items.AddRange(toUse.Select(t => new ChooseItem(t)));

List<string> toUse = new List<string>();
toUse.AddRange(items.Select(i => i.Property).Distinct());
Items.AddRange(toUse.Select(t => new ChooseItem(t)));
// Gesamtzeit unter 1 Sekunde.

Wie kann das sein, kennt das jemand?

14.06.2010 - 18:33 Uhr

Wenn man die meisten Antworten hier liest und man überlegt auf welchem Forum wir hier sind, dann lässt sich tatsächlich fast schlussfolgern: "Ein Großteil der Softwareentwickler hat wenig bis gar nichts für Fußball übrig". Erstaunliche Erkenntnis! :evil:

Im C++ Forum ist es wider anders, man muss entweder sagen das es nur bei den C# Entwicklern so ist. Oder der Thread wird immer von nur einer Gruppe gekapert 😁

14.06.2010 - 15:42 Uhr

Ich kann die Armbänder nicht bestellen, habe dieses komische Paypal nicht ^^

14.06.2010 - 12:41 Uhr

Also mich lässt Fußball genauso kalt, ich halte es immer mit der Devise das ich meine ruhe will.
Bisher habe ich aber nicht zu klagen, sehe kaum Fahnen und laut ist es bisher in meiner Umgebung auch nicht.

Das alle nerven und ich mecker kommt später sobald es lauter wird, noch habe ich kein Grund dazu.

13.06.2010 - 22:31 Uhr

Ich beschäftige mich derzeit auch damit, lese das Buch "Clean Code" von dingsbums. Sehe mich noch bei Schwarz.

Wobei ich bisher feststellen musste das ich mich schon sehr lange an diverse "regeln" halte die in CCD definiert sind ohne davon zu wissen 😁

13.06.2010 - 09:54 Uhr

http://www.my-libraries.de/dianthus/previews/
Ich arbeite aber an einer neueren Version die noch einfacher zu benutzen ist.
Auf meiner Website gibt es auch eine Demo.

Es gibt die Ribbons auch kommerziell: http://www.devcomponents.com/dotnetbar-wpf/wpfribbon/
Die frage ist, was versteht man unter einer "Exakten Kopie", nur das aussehen oder auch die Verwendung?
Auf deren Seite sehe ich auch keine Einschränkungen, und die verwenden sogar alle Offiziellen MS namen.

13.06.2010 - 09:28 Uhr

Was soll den der Quatsch?

Warum holst du dir alle Nodes und vergleichst den namen? Hol dir doch direkt den Node anhand des namens.

=> Das sind doch absolute Basics.

var test = root.Descendants("P2_01").FirstOrDefault();
if (test != null)
{
textBox1.Text = test.Value;
}

PS. Strings braucht man nicht nochmal zu strings machen, ich denk da an dein el.Name.ToString() oder (string) test.Value

04.06.2010 - 16:14 Uhr

Soviel Code für so ein bisschen kram...

// just pseudo, hier im forum getippt
public void OnMenuItem_Click(object sender, RoutedEventArgs e)
{
    MenuItem checkedMenuItem = (MenuItem)sender;
    bool oldCheck = checkedMenuItem.IsChecked;
    foreach (MenuItem item in Root_MenuItem)
        item.IsChecked = false;
    checkedMenuItem.IsChecked = oldCheck;
}
29.05.2010 - 11:13 Uhr

Kann ich nicht reproduzieren.
Ich würde sagend das Liegt an den verwendeten Controls und welche Resource Dictionaries (wie groß) geladen wird.
Visual Studio durchläuft die Konstruktoren der Controls bereits zur Entwicklungszeit.

Lass einfach die bescheuerte ToolBox weg und öffne Fenster nur in Full Xaml View.

>> Daten vom TFS aufrufen oder in Datei-Laschen wechseln (10 sek) dauern entsprechend.
Das kommt natürlich auch auf den TFS Server an. Wir haben ein recht dicken dahinter welcher sehr flott läuft.

Mein Projekt welches seit 2008 läuft ist auch schon mittelgroß und ich habe diese Performance Probleme nicht 😉

29.05.2010 - 11:10 Uhr

Dann pack doch ein ItemsControl ins den Canvas und setzt dort das ItemsPanel entsprechend. Mehr kann ich zu dem Thema nicht sagen, wenn dir das nicht gefällt musst du halt bei jedem Neu zeichnen die höhen selber ermitteln und positionieren, Handarbeit also.

28.05.2010 - 21:52 Uhr

wenn du alles so genau zeichnen musst, kannst du doch die ganzen items selber ganz genau setzen...

28.05.2010 - 19:51 Uhr

Müsste mit den RelativeSource gehen.

Also mal Pseudo:

<Button Command="{Binding DataContext.BlaCommand, RelativeSource={RelativeSource FindAnchestor, AnchestorType={x:Type Window}}" />