Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von blackdynamic
Thema: Threading-Problem bei MVVM-Struktur mit asynchronem Service
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich verwende WPF, aber die konkreten asynchronen Services, welche dann von der oben geposteten Klasse abgeleitet sind, werden dem PersonenManager über einen IOC Container injeziert.
Dieser Container registriert die asynchronen Services innerhalb der App.xaml.cs also direkt im GUI-/Main-Thread.

Ich hoffe das hilft euch weiter ..

Thema: Threading-Problem bei MVVM-Struktur mit asynchronem Service
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich bin mittlerweile auf die Erklärung von herbivore bezüglich meines Problems gestoßen:
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Allerdings befindet sich dort folgende Aussage:

Zitat
BackgroundWorker

Statt mit extra Threads und Control.Invoke, kann man auch mit der BackgroundWorker-Klasse ungültige threadübergreifende Vorgänge vermeiden. Dazu müssen bei BackgroundWorker alle Zugriffe auf das GUI einfach aus den ProgressChanged- oder RunWorkerCompleted-EventHandlern durchgeführt werden. Wenn man sich daran hält, ist explizites Control.Invoke bei BackgroundWorker nicht erforderlich, denn die genannten EventHandler werden hinter den Kulissen automatisch per Control.BeginInvoke aufgerufe

Und das ist es ja, was ich auch erwartet habe ... vielleicht zum besseren Verständniss ein Ausschnitt aus meinem BackgroundWorker:


public abstract class MyAsyncServiceBase
{
	(...)
	protected void AnyGenericInvoke<TAsyncRequest, TAsyncResponse>(TAsyncRequest asyncRequest, Func<TAsyncRequest, TAsyncResponse> method, Action<TAsyncResponse> asyncCallback)
	{
		BackgroundWorker worker = new BackgroundWorker();

		worker.DoWork += (sender, args) =>
		{
			args.Result = method(asyncRequest);
		};

		worker.RunWorkerCompleted += (sender, args) =>
		{
			if (asyncCallback != null)
				asyncCallback(args.Result as TAsyncResponse);
		};

		using (worker) 
		{ 
			worker.RunWorkerAsync(); 
		}
	}
}

Ich hoffe es gibt hier jemanden, der mich "erleuchten" kann ..

*edit Ja, den habe ich auch gerade gefunden, den Thread. Aber wie ich ja oben zitiert habe sagt auch dieser aus, dass es mit dem Backgroundworker so funktionieren sollte..
In schmeisse in keiner asynchronen Methode ein Event.

Thema: Threading-Problem bei MVVM-Struktur mit asynchronem Service
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo liebe Community,

ich habe zwei Probleme bei folgendem Szenario:


public class PersonViewModel()
{
	public ObservableCollection<Person> People;
	private IPersonManager _personManager;

	public PersonViewModel(IPersonManager personManager)
	{
		_personManager = personManager;
		People = new ObservableCollection<Person>();
		_personManager.People.CollectionChanged += ((object sender, NotifyCollectionChangedEventArgs e) => this.People = _personManager.People);
	}
}

public class PersonManager
{
	public ObservableCollection<Person> People;
	private IAsyncPersonService _asyncPersonService;
	private IPersonChangeInitiator _initiator;
	
	public PersonManager(IAsyncPersonService asyncPersonService, IPersonChangeInitiator initiator)
	{
		People = new ObservableCollection<Person>();
		_asyncPersonService = asyncPersonService;
		_initiator = initiator;
		_initiator.OnAddNewPerson += onAddNewPerson;
	}
	
	public void onAddNewPerson()
	{
		_asyncPersonService.InvokeGetAnyPerson(new GetAnyPersonRequest(), invokeGetAnyPersonCallback);
	}
	
	private void invokeGetAnyPersonCallback(GetAnyPersonResponse response)
	{
		if(response != null)
		{
			Person person;
			
			if(response.IsNewPerson)
			{
				person = response.Person;
				People.Add(person);
			}
			else
				// Für dieses Beispiel setze ich einfach mal voraus, dass der Nachname eindeutig ist
				person = People.GetPersonByName(response.Person.Name);
				
			doAnythingWithPerson(person);
		}
	}
}

Der AsyncPersonService startet die aufgerufene Methode über einen Backgroundworker asynchron.

Wenn der PersonChangeInitiator das erste mal das OnAddNewPerson-Event schmeisst, und es sich um eine neue Person handelt, wird diese ohne Probleme der Liste im PersonManager hinzugefügt
und das CollectionChanged-Event kann ohne Probleme im View-Model gefangen werden. Das bedeutet, auch die Liste im ViewModel hat nun die neue Person.

Problem 1:
Schmeisst der PersonChangeInitiator jedoch ein zweites mal dieses Event, natürlich dieses mal mit anderen Werten um noch eine andere Person anzulegen, bekomme ich bei "People.Add(person);" folgende Exception:
Fehler
Von diesem CollectionView-Typ werden keine Änderungen der "SourceCollection" unterstützt, wenn diese nicht von einem Dispatcher-Thread aus erfolgen

Problem 2:
Wird nach dem Ersten OnAddNewPerson-Event vom PersonChangeInitiator erneut das OnAddNewPerson-Event geschmissen, und in der GetAnyPersonResponse befindet sich keine neue Person sondern die gerade zuvor angelegte,
kann ich mir das zuvor angelegte Personenobjekt über den Namen aus der People-Liste holen("People.GetPersonByName") und in der Methode "doAnythingWithPerson(person)" zwar verändern,
dass ViewModel wird darüber allerdings nicht mehr über das CollectionChanged-Event der People-Liste benachrichtigt.

Ich vermute mal, dass diese beiden Probleme miteinander zusammenhängen, richtig?

Ich hatte schon vor etwas längerer Zeit mal Probleme mit Threading, Dispatcher usw. Hatte damals aber auch keine MVVM-Anwendung und habe es einfach im Codebehind über so einen Dispatcher-Workaround gedreht.
Da ich mich damals aber noch nicht so gut mit Programmierung auskannte, war der Code sehr unübersichtlich und schlecht geschrieben, auch wenn er funktionierte.

Deshalb hatte ich mich zum Entwurf einer komplett neuen Struktur entschlossen, die nun wie eben gesagt auf dem MVVM Pattern basiert und mit asynchronen Methoden arbeitet.
Ich dachte eigentlich, durch das Verwenden des Callbacks bei asynchronen Methoden könnte ich sicher stellen, dass ich immer wieder im gleichen Thread lande, nachdem die asynchrone Methode durchgelaufen ist.
Von daher hatte ich mir davon eigentlich erhofft, die Dispatcher-Problematik umgangen zu haben.

Könnt ihr mir eventuell weiter helfen, was ich verändern / anpassen muss um die Probleme zu beheben?
Und wo liegt der Fehler in meiner Denkweise, bezogen auf das Threading-Verhalten der MVVM Struktur mit asynchronen Methoden?

Viele Grüße
blackdynamic

Thema: Veränderung an Objekt in asynchroner Methode im aufrufenden Thread nicht sichtbar
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Genial, damit läuft der Test durch! Danke :)

Thema: Veränderung an Objekt in asynchroner Methode im aufrufenden Thread nicht sichtbar
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Vielen Dank für eure Geduld und Eure Hilfe!

Ich war auch der Meinung das die Referenz übergeben wird und genau das war auch der Grund warum ich so ratlos war.

Letztendlich lag das Problem nun darin, dass die Peson in der Liste zwar aktualisiert wurde (was ich auf deine Anmerkung hin direkt im Callback getestet habe) aber ich in meinem Unit Test noch die alte Liste hatte weil die Überprüfung des Tests nicht gewartet hat, bis der Callback fertig gelaufen war.

Das bedeutet der Fehler lag in meinem Unit Test, nochmals vielen Dank :)

Thema: Veränderung an Objekt in asynchroner Methode im aufrufenden Thread nicht sichtbar
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Die Person befindet sich in einer ObservableCollection

Thema: Veränderung an Objekt in asynchroner Methode im aufrufenden Thread nicht sichtbar
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Nein, weil ich nicht wirklich weiss wo ich es fangen sollte um mein Problem zu lösen. Ich will ja bloß, dass die Person aus der Liste innerhalb der Liste aktualisiert wird wenn eine Eigenschaft der Person in einer asynchronen Methode geändert wird.

Thema: Veränderung an Objekt in asynchroner Methode im aufrufenden Thread nicht sichtbar
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich habe die Person Klasse nun wie folgt angepasst:


public class Person : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return this._name; }

set
{
if (value != this._name)
{
this._name = value;
NotifyPropertyChanged("Name");
}
}
}

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}

public Person()
{
Name = "Olaf";
}
}

Es funktioniert allerdings leider trotzdem noch nicht.
Beim debuggen fällt auf, dass diese Bedingung "PropertyChanged != null" immer false ist und somit das Event nicht geschmissen wird.
Das diese Bedingung false ist sagt ja aus, dass es keine Abonnenten für das Event gibt, wisst ihr wo mein Fehler liegt?

Thema: Veränderung an Objekt in asynchroner Methode im aufrufenden Thread nicht sichtbar
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo liebe Community,

ich habe folgendes Problem:
Wenn ich eine Eigenschaft eines Objektes, welches sich in einer Liste von Objekten befindet, während einer asynchron laufenden Methode verändere, bekommt der Thread, welcher die asynchrone Methode aufgerufen hat, die Veränderung an dem Objekt nicht mit.
Könnt ihr mir sagen was ich dafür verändern muss?

Hier ein kleines Beispiel:

ViewModel.cs



public ObservableCollection<Person> Persons;

...

public void onAddPerson(object sender, EventArgs e)
{
// Der Name der Person wird im Konstruktor auf Olaf gesetzt. Ob man das so machen würde
// sei dahin gestellt, es geht nur darum meine Situation an einem Beispiel zu
// verdeutlichen
var person = new Person();
Persons.Add(person);

var request = new ChangePersonRequest(person);

// Der asynchrone Aufruf erfolgt über einen Backgroundworker
_asyncService.invokeChangePerson(request, changePersonCallback);
}

private void changePersonCallback(ChangePersonResponse response)
{
// An dieser Stelle ist der Name der Person in der Liste immernoch Olaf.
// Die Person soll aber den Namen haben, der ihr in der asynchronen Methode zugewiesen wurde
persons[0].Name
}

Service.cs


....
public ChangePersonResponse ChangePerson(ChangePersonRequest request)
{
request.CurrentPerson.Name = "Max";

var response = new ChangePersonResponse(request.CurrentPerson);

return response; 
}

ChangePersonResponse.cs


....
public class ChangePersonResponse
{
public Person CurrentPerson {get; set;}

public ChangePersonResponse(Person person)
{
CurrentPerson = person
}
}

ChangePersonRequest.cs


public class ChangePersonRequest
{
public Person CurrentPerson {get; set;}

public ChangePersonRequest(Person person)
{
CurrentPerson = person
}
}

Person.cs


public class Person
{
public string Name {get; set;}

public Person()
{
Name = "Olaf";
}
}

Thema: Backgroundworker Kollisionsgefahr?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich verwende zur Zeit asynchrone Methodenaufrufe, die denen hier im Kapitel 5.5 ([Artikel] Multi-Threaded Programmierung) sehr ähneln.

Das heisst, das Senden der Daten soll ebenfals in so einem asnychronen Methodenaufruf erfolgen.

Der Service zum senden der Daten würde der asynchronen Methode als request Parameter übergeben werden. Dürfte ich von meiner asynchronen Methode aus, die sich hinter dem asynchronen Proxy befindet, auf eine statische SyncQueue zugreifen, die sich in dem ViewModel befindet das die asynchrone Methode aufruft?
Auch in Bezug auf das MVVM Pattern..

Ich hoffe ihr versteht was ich meine :)

Viele Grüße


*edit -> Oder wie wäre es, wenn ich die SyncQueue in das request objekt einbauen würde? Wäre das "sauberer"?

Thema: Backgroundworker Kollisionsgefahr?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Vielen Dank :)

Thema: Backgroundworker Kollisionsgefahr?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Vielen Dank für eure schnellen Antworten. :)

Der Service schmeisst zusätzlich noch Events, wenn er selbst Daten empfangen hat.
Kann das in Kombination mit den SyncQueue zu Komplikationen führen?

Thema: Backgroundworker Kollisionsgefahr?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Sehr geehrte Community,

ich stehe zur Zeit vor folgendem Problem:
Ich habe einen Service, der es mir ermöglicht Daten zu versenden.
Das senden der Daten würde ich gerne asynchron über einen Backgroundworker laufen lassen.
Es müssen von mehreren verschiedenen Stellen aus Daten gesendet werden können.

Nun zu meinen zwei Fragen:
1. Ist die wahrscheinlichkeit groß, dass es dabei zu einer Kollision kommt?
2. Wie könnte ich so eine Kollision verhindern? Am besten wäre wenn ich einem Thread sagen könnte: "Wenn gerade jemand anders Daten sendet, dann warte bis der damit fertig ist und fang dann erst an zu senden"

Ich würde mich freuen, wenn ihr mir helfen könnt.

Viele Grüße
blackdynamic

Thema: Silverlight animierte Navigationsbar
Am im Forum: GUI: WPF und XAML

Schade das mir hierbei wohl keiner Helfen kann ...
Dann schraube ich meine Wünsche ein wenig zurück.

Kann mir denn vielleicht jemand sagen wie ich einfach eine Navigation bauen kann die Submenüs hat? Lassen wir die effekte einfach mal weg, von mir aus kann das auch einfach eine ganz normale Liste sein wie sie hier im Forum auf der linken Seite ja auch zu sehen ist.

Viele Grüße

Thema: Silverlight animierte Navigationsbar
Am im Forum: GUI: WPF und XAML

Hallo Community,

ich würde gerne auf meiner Silverlight Website eine animierte Navigationsbar verwenden.

Unter einer animierten Navigationsbar verstehe ich, dass Submenüs "herausfahren" wenn ich mit der Maus über ein
Element der Navigationsbar gehe.

Kann mir jemand sagen wie man soetwas am besten macht, bzw. wo ich ein tutorial dazu finden kann?

Viele Grüße

Thema: Silverlight Toolkit Themes verwenden
Am im Forum: GUI: WPF und XAML

Hallo,

falls noch jemand dieses Problem hat:

Dynamically apply and change Theme with the Silverlight Toolkit

Dieser Link hat mir letztendlich geholfen.

Viele Grüße.

Thema: Silverlight Toolkit Themes verwenden
Am im Forum: GUI: WPF und XAML

Hallo liebe Community,

ich habe folgendes Silverlight Toolkit installiert: http://silverlight.codeplex.com/releases

(Nicht das für Windowsphone sondern das normale)

Dort drin sind Themes enthalten, aber ich habe nun seit stundenlanger Recherche keine Möglichkeit gefunden, diese in eine ganz simple HelloWorld Website so einzubauen das sie funktionieren. Ich kann sie zwar so einbauen das es beim compilieren keinen Fehler gibt, aber dann wird mir auf der Seite nichts angezeigt.

Kann mir jemand von euch sagen, wie ich dieses Themes korrekt verwenden kann so das sie auch angezeigt werden?

Ich wäre euch sehr dankbar ...

Viele Grüße
blackdynamic

Thema: Editierbare ComboBox - Markierung nur bei genauem Ergebnis
Am im Forum: GUI: WPF und XAML

Hallo Liebe Community,

gibt es eine Möglichkeit der ComboBox zu sagen, dass sie ein Item nur dann selektieren soll, wenn es wirklich genau (!) mit der Eingabe in der edtitierbaren ComboBox übereinstimmt?

Denn ich habe z.Z. das Problem, wenn ich zum Beispiel "Micha" eingebe, wird "Michael" zwar richtig ausgewählt, wenn ich dann aber das "a" am Ende löschen und durch ein "s" ersetze, bleibt Michael markiert. Meine Erwartungshaltung wäre allerdings, dass die Markierung direkt verschwindet, wenn die Eingabe nicht mehr genau mit einem der Items übereinstimmt.

Meine ComboBox:


<ComboBox Height="30" VerticalAlignment="Top" IsEditable="True" IsTextSearchEnabled="True" Margin="10" KeyDown="ComboBox_KeyDown" IsSynchronizedWithCurrentItem="True">
			<ComboBoxItem>
				<TextBlock Text="Michael"/>
			</ComboBoxItem>
			<ComboBoxItem>
				<TextBlock Text="Mike"/>
			</ComboBoxItem>
			<ComboBoxItem>
				<TextBlock Text="Olaf"/>
			</ComboBoxItem>
</ComboBox>

Gibt es irgendein Attribut was man bei der CB evtl. setzen kann um das zu ermöglichen? Habe mir schon den MSDN Eintrag zur CB durchgelesen aber keinen Hinweis gefunden.

Klar könnte man sowas auch selber schreiben aber ich denke sowas muss die CB doch auch standardmäßig unterstützn oder ...?

Thema: TabIndex eines TabControls wird nicht beachtet?
Am im Forum: GUI: WPF und XAML

Hallo Community,

ich habe das Problem, dass ich beim Starten meiner Anwendung den Fokus auf dem ersten TabItem meines tabControls haben möchte.
Jedoch liegt der Fokus zu Begin auf dem Control, dass NACH dem TabControl den geringstens TabIndex hat.
Ich habe das Gefühl, dass der TabIndex bei dem TabControl nicht beachtet wird.

Hier mein Code:


<Window x:Class="TabItemSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="800" Width="800">
    <StackPanel>
        <TabControl TabIndex="300" Name="TabControl1">
                <TabItem Header="TabItemVonTabControl1" TabIndex="301">
                    <StackPanel>
                        <TextBox Name="TextBox1" Margin="10" TabIndex="302"/>
                        <ComboBox Name="ComboBox1" Margin="10" TabIndex="303"/>
                        <Button Name="Button1" Margin="10" TabIndex="304"/>
                        <TextBox Name="TextBox2" Margin="10" TabIndex="305"/>
                    </StackPanel>
                </TabItem>
            </TabControl>
        <TextBox Name="TextBox3" Margin="10" TabIndex="200"/>
        <Button Name="Button2" Margin="10" TabIndex="201"/>
        <TabControl TabIndex="100" Name="TabControl2">
            <TabItem Header="TabItemVonTabControl2" TabIndex="101">
                <StackPanel>
                    <TextBox Name="TextBox4" Margin="10" TabIndex="102"/>
                    <ComboBox Name="ComboBox2" Margin="10" TabIndex="103"/>
                    <Button Name="Button3" Margin="10" TabIndex="104"/>
                    <TextBox Name="TextBox5" Margin="10" TabIndex="105"/>
                </StackPanel>
            </TabItem>
        </TabControl>
        <TextBox Name="TextBox6" Margin="10" TabIndex="400"/>
        <Button Name="Button4" Margin="10" TabIndex="401"/>
    </StackPanel>
</Window>

Bitte beachtet, dass TabControl1 einen höheren TabIndex hat als TabControl2 und somit eigentlich erst TabControl2 den Fokus erhalten sollte.

Trotzdem ist die Fokusreihenfolge wie folgt:
- TextBox3
- Button2
- TextBox6
- Button4
- TabControl1
- TextBox1
- ComboBox1
- Button1
- TextBox2
- TabControl2
- TextBox4
- ComboBox2
- Button3
- TextBox5

Könnt ihr mir sagen, wie ich die TabControls richtig in die Tab-Reihenfolge einbauen kann?

Viele Grüße.

Thema: Combobox - Autovervollständigung
Am im Forum: GUI: WPF und XAML

Hallo Community,

ich möchte meine Combobox mit einer Autovervollständigung ausrüsten.
Die "Suchfunktion" habe ich schon benutzt, allerdings ergab sie keine Treffer.

Hier ist mein Code-Snippet:


MainWindow.xaml:

<ComboBox Height="30" Width="200" IsEditable="True" ItemsSource="{Binding}" IsTextSearchEnabled="False" Name="comboBox">
            <ComboBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel IsVirtualizing="True" IsItemsHost="True" />
                </ItemsPanelTemplate>
            </ComboBox.ItemsPanel>
            
</ComboBox>

MainWindow.cs:

public MainWindow()
        {
            InitializeComponent();

            List<String> names = new List<string>();
            names.Add("Michael");
            names.Add("Mike");
            names.Add("Manuel");
            names.Add("Olaf");
            this.DataContext = names;
            comboBox.Loaded += delegate
            {
                TextBox textbox = comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox;
                Popup popup = comboBox.Template.FindName("PART_Popup", comboBox) as Popup;

                textbox.AutoWordSelection = false;

                if (textbox != null)
                {
                    textbox.TextChanged += delegate
                    {
                        if (textbox.Text != String.Empty)
                        {
                            popup.IsOpen = true;
                            comboBox.Items.Filter += text =>
                                {
                                    if (text.ToString().Contains(textbox.Text))
                                        return true;
                                    return false;
                                };
                        }
                        else
                        {
                            popup.IsOpen = false;
                            comboBox.Items.Filter = null;
                        }
                    };
                }
            };
        }


Ich habe nun 2 Probleme:

1. Wenn ein Buchstabe geschrieben wird, wird dieser direkt zu Beginn markiert.
Das bedeutet es ist nicht möglich, z.B. "Michael" hintereinander zu schreiben.
Denn das "M" wird direkt markiert, sodass im Endeffekt dann "ichael" in der Textbox steht. Man muss also erst "M" schreiben, dann die Markierung per Hand wegmachen und "ichael" hinterher schreiben.

Gibt es eine Möglichkeit, diese automatische Markierung nach einem Zeichen auszustellen?

2. Wenn ich einen Namen ausgesucht habe, und diesen aus der Textbox lösche bleibt er trotzdem in der Textbox ausgewählt.
Im Debugger ist zu sehen, dass das TextChanged Event 2 mal geschmissen wird. Zuerst mit dem Text "", was meiner Erwartungshaltung entspricht.
Daraufhin wird auch der Filter der Combobox (vermutlich) korrekt gesetzt.
Das Problem ist nun, dass danach direkt noch ein TextChanged Event geschmissen wird, welches der Textbox wieder den Wert gibt, den sie vorher hatte. Ich habe keine Ahnung wer dieses Event schmeißt und warum es plötzlich den Wert der Textbox wieder zurück setzt.

Könnt ihr mir sagen wie ich dieses zweite TextChanged Event unterbinden kann und wo es her kommt bzw. wer es schmeißt?

Ich würde mich freuen, wenn ihr mir helfen würdet.

Viele Grüße

Thema: DataGrid Änderungen in die Datenbank übernehemn
Am im Forum: GUI: WPF und XAML

Du kannst zum Beispiel einen OR-Mapper wie NHibernate verwenden. Der übernimmt dann das Speichern und auslesen aller Entitäten für dich.

Thema: WPF TextBoxErrorTemplate mit DropShadowEffect
Am im Forum: GUI: WPF und XAML

Hallo Community,

ich habe mich gerade ein wenig mit den Validierungsmöglichkeiten in WPF auseinandergesetzt.

Nun kann man beispielsweise beim Validieren einer Textbox ein ErrorTemplate definieren, dass das Aussehen der Textbox im Falle eines Fehlers beschreibt.

Zur Zeit wird mein Fenster nach Auftreten eines Fehlers mit einem normalen roten Ramen umrundet.
Ich würde diesen Ramen gerne gegen einen DropShadowEffect austauschen, so wie ich ihn in der Textbox darunter (ohne Fehlerbehandlung) implementiert habe.

Hier meine XAML-Datei:


<Window x:Class="SimpleValidationSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SimpleValidationSample"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <local:Person x:Key="data" />
        <ControlTemplate x:Key="TextBoxErrorTemplate" TargetType="Control">
            <WrapPanel ClipToBounds="False" >
                <Border BorderBrush="Red" BorderThickness="1">
                    <AdornedElementPlaceholder Name="adornedElement" />
                </Border>
                <TextBlock Text="{Binding ElementName=adornedElement,
                                          Path=AdornedElement.(Validation.Errors),
                                          Converter = {local:ValidationErrorToErrorMessageConverter}}"
                           FontSize="12"
                           Foreground="Red"
                           Margin="5 0 0 0"/>
            </WrapPanel>
        </ControlTemplate>
    </Window.Resources>

    <Window.DataContext>
        <Binding Source="{StaticResource data}" />
    </Window.DataContext>

    <StackPanel>
        <TextBox Name="txt" VerticalAlignment="Top" Margin="5, 20, 0, 0" Height="20" Width="130" ToolTip="Der Username darf maximal 15 Zeichen lang sein" Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}">
            <TextBox.Text>
                <Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <local:NameValidator/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
        <TextBox Margin="5, 20, 0, 0" Height="20" Width="130">
            <TextBox.Effect>
                <DropShadowEffect ShadowDepth="0" Color="Red" BlurRadius="5" />
            </TextBox.Effect>
        </TextBox>
    </StackPanel>
</Window>

Folgende Lösung habe ich bereits versucht:


                    <AdornedElementPlaceholder Name="adornedElement">
                        <AdornedElementPlaceholder.Effect>
                            <DropShadowEffect ShadowDepth="0" Color="Red" BlurRadius="5" />
                        </AdornedElementPlaceholder.Effect>
                    </AdornedElementPlaceholder>

Diese Lösung lässt sich zwar kompilieren, hat aber keinerlei Auswirkungen auf die Ansicht der Textbox beim Auftreten eines Fehlers.

Viele Grüße
blackdynamic

Thema: Controls Animieren
Am im Forum: GUI: WPF und XAML

Ja, der Expander macht eigentlich schon das richtige, nur das er den Content nach unten ausklappt, und ich möchte gerne das sich der Header praktisch mit nach oben schiebt.
Desweiteren würde ich dir Geschwindigkeit des Hochklappens gerne regulieren.

Das ich die Reaktion auf das Mouseover mit Triggern lösen kann habe ich bereits verwendet.

Mein Problem liegt darin, dass sich der Content Bereich der Groupbox während der ANimation vergrößern soll, ohne das sich der Header und der Text im Header dabei verzerren (d.h. mit vergrößern)

Thema: Controls Animieren
Am im Forum: GUI: WPF und XAML

Hallo Community,

ich versuche gerade meine Kenntnisse zum Thema Animationen in WPF ein wenig zu erweitern.
Nun wollte ich mal versuchen, eine Groupbox ausklappen zu lassen, sobald der Mauszeiger darüber geht.

Ich arbeite mit Expression Blend, habe aber leider keine Möglichkeit gefunden, diese Animation zu entwickeln.
Ich möchte innerhalb meines Timestamps die Groupbox vergrößern.
Wenn ich nun auf 2 Sekunden in der Zeitleiste klicke und danach die Groupbox größer ziehe wird alles mit vergrößert (Schriftart, Header, ...) sodass man praktisch keinen Platz für Inhalt dazu gewinnt, sondern lediglich alles größer wird.

Ich habe auch schon versucht ein Template für eine GroupBox anzulegen und dieses dann entsprechend zu animieren, leider hat das aber auch nicht zum Ziel geführt.

Ich würde mich freuen, wenn mir jemand von euch weiter helfen könnte.

Viele Grüße
blackdynamic

Thema: Suche Freeware Obfuscator
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Der Eazfuscator.NET obfuscator sollte an dieser Stelle ebenfalls genannt werden.
Eazfuscator.NET

Ich habe nun schon mehrere Obfuscatoren ausprobiert, meiner Ansicht nach sind der Phoenix Protector und der Eazfuscator.NET obfuscator die beiden besten.

Wobei der Eazfuscator.NET obfuscator die Namespaces, Klassen und Methoden stärker verschlüsselt, wohingegen der Phoenix Protector meinen Disassembler öfter zum Abstürzen bringt.

Viele Grüße.

Thema: ProtectedData - Wo der Klartext?
Am im Forum: Rund um die Programmierung

Hallo Herbivore,

danke für deine Informationen.
Ich habe mir das FAQ und alle verlinkten Themen durchgelesen, konnte dort aber keine Antwort auf meine Frage finden.
Wenn ich das hier richtig verstanden habe:


// Pass a logRounds parameter to GenerateSalt to explicitly specify the
// amount of resources required to check the password. The work factor
// increases exponentially, so each increment is twice as much work. If
// omitted, a default of 10 is used.
string hashed = BCrypt.HashPassword(password, BCrypt.GenerateSalt(12));

// Check the password.
bool matches = BCrypt.CheckPassword(candidate, hashed);

Wird das Passwort hier ebenfalls in einer Variable "password" gespeichert?!

Meine Frage ist nun wo ich den Klartext, den die Passwortvariable enthält am besten bzw. sichersten zuweisen kann?

Thema: ProtectedData - Wo der Klartext?
Am im Forum: Rund um die Programmierung

Hallo Community,

ich möchte mein E-Mail Passwort im Code so verschlüsseln, das es beim disassemblern nicht ausgelesen werden kann.

Beim verschlüsseln Hilft mir die Klasse ProtectedData mit der Methode Protect.

Beispiel:


byte[] s_aditionalEntropy = { 9, 8, 7, 6, 5 };
System.Text.ASCIIEncoding asc = new System.Text.ASCIIEncoding();

byte[] secure = ProtectedData.Protect(asc.GetBytes("ich bin ein passwort"), s_aditionalEntropy, DataProtectionScope.CurrentUser);
System.Net.NetworkCredential nc = new System.Net.NetworkCredential("blackdynamic", asc.GetString(ProtectedData.Unprotect(secure, s_aditionalEntropy, DataProtectionScope.CurrentUser)));

Meine Frage ist nun, muss ich die Zeile (asc.GetBytes("ich bin ein passwort")) noch irgendwie so verschlüsseln, dass ich "ich bin ein passwort" in den Application Settings ablege o.ä.?
Oder kann das Passwort so schon nicht mehr beim disassemblern ausgelesen werden?

Thema: Sinnvolles Threading: An welchen Stellen soll man Threading einsetzen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von Uwe81
Hallo!

Mittels Profiler kannst du rausbekommen, wo dein Programm viel Zeit verbraucht.

Wie benutze ich so einen Profiler denn bzw. wo bekomme ich einen her?
Zitat von michlG
Messen braucht man da imho nix.
Alle Vorgänge die unter bestimmten Umständen länger als 1 Sek dauern, sollten meiner Meinung ausgelagert werden (sofern es sich nicht um die GUI handelt)

wie soll ich denn ohne Messen herausfinden welcher Vorgang über eine Sekunde dauert?

Thema: Sinnvolles Threading: An welchen Stellen soll man Threading einsetzen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Wo ist denn der Unterschied ob ein Thread aus dem Threadpool verwendet wird oder nicht?

Kann man irgendwie messen welche Aufgaben aufwändig sind? Kenne mich damit noch nicht so gut aus ...

Thema: Sinnvolles Threading: An welchen Stellen soll man Threading einsetzen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Sorry aber ich meinte eher wo es Erfahrungsgemäß Sinn macht Threading ein zu setzen also wann es an welchen Stellen am effektivsten ist.

Ist der Backgroundworker "sauberer" als die normale Thread Klasse oder als das Invoken von Delegates?