Laden...

Forenbeiträge von haja0011 Ingesamt 19 Beiträge

17.09.2012 - 13:16 Uhr

Hallo gfoidl,

danke, das habe ich gesucht.

Viele Grüße
Jan

16.09.2012 - 18:55 Uhr

Hallo,

ich habe mir mit dem Visual Studio 2010 über eine Service Referenz aus einer WSDL Client code generieren lassen. Nun möchte ich für Debug Zwecke den Request und Response im XML Format abspeichern können, damit ich nicht immer Wireshark benutzen muss.

Wie komme ich an den generierten Soap Request und Response?

Viele Grüße
Jan

25.10.2011 - 16:28 Uhr

Hallo Nuky,

leider konsumiere ich den service bloß. Es ist auch kein WCF service.
Ich werde die Kompatibilität weglassen, denn wie du sagtest muss ich auch mit "minOccurs=0" immer Parameter übergeben.

Viele Grüße
Jan

19.10.2011 - 11:01 Uhr

Hallo,

in einer WSDL ist in einer Methode ein neues Attribut hinzugekommen Parameter "guid". Damit die WSDL grundsätzlich "kompatibel" bleibt, wurde

minOccurs="0"

verwendet. Leider generiert WCF den Clientcode so, dass der Parameter nicht optional ist. Ich muss ihn in der Client Verwendung angeben und dann akzeptiert ihn der alte Webservice nicht mehr.

Gibt es eine Möglichkeit den Client so generieren zu lassen das, wenn ich den Parameter weglasse der Parameter nicht serialisiert wird, und wenn ich den Parameter angebe dieser serialisiert wird?

Auszug aus WSDL. Der Parameter der optional sein muss ist "guid".


<xs:element name="getOrCreateString">
	<xs:complexType>
		<xs:sequence>
			<xs:element minOccurs="0" name="guid" nillable="true" type="xs:string"/>
			<xs:element minOccurs="0" name="emailAddress" nillable="true" type="xs:string"/>
			<xs:element maxOccurs="unbounded" minOccurs="0" name="keys" nillable="true" type="xs:string"/>
			<xs:element maxOccurs="unbounded" minOccurs="0" name="values" nillable="true" type="xs:string"/>
			<xs:element minOccurs="0" name="outputType" nillable="true" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
</xs:element>

Viele Grüße
Jan

06.07.2011 - 06:33 Uhr

Hallo,

Ja das werde ich wohl machen. Also nur die Fehler anzeigen. Dann sehe ich mir noch die Sache mit der Virtualisierung an. Dann wird das was.

Danke.
Gruss Jan

05.07.2011 - 21:39 Uhr

Hallo gfoidl,

das Projekt ist ein Mailsendetool für Testzwecke für Mailing Systeme. Das ganze ist eine Art Log. Jeder Eintrag sagt ob die Mail erfolgreich gesendet werden konnte, den Pfad zur Mail oder ob es einen Fehler gab und wenn, was für einen. Fehler kann z.B. sein, dass die Mail zu groß war, der Mailserver nicht verfügbar war...

Bis jetzt habe ich einfach nach 3000 Nachrichten aufgehört alles zu loggen und nur noch die Fehler geloggt, bis zu 10000 Einträgen, und dann auch damit aufgehört. Wenn ich ein paar mehr anzeigen könnte währe es schon nicht schlecht.

Gruß
Jan

05.07.2011 - 21:16 Uhr

Hallo,

ich habe x Threads welche einen Event auslösen und über

public delegate void UpdateMailSendingCallback(MessageWrapper msg, MailState mailState);

dann das Frontend aktualisieren. Jeder Thread aktualisiert das Frontend vielleicht 1-4 mal pro Sekunde je nach Datenmenge.
Das Frontendelement welches aktualisiert wird ist eine ListBox.

myServerControl.mailingOutput.Items.Add(msg.MessagePath);

Bis jetzt füge ich direkt Strings zu der ListBox hinzu. Es können in der ListBox 10000 - mehrere 100000 Elemente werden. Jetzt dauert das Hinzufügen zur ListBox aber schon bei 6000 elementen so lange das, dass Frontend "einfriert".
Was ich mir überlegt habe ist, dass ich den String in eine Klasse kapsel, und das Element auch nicht mehr direkt in das Control hinzufügen, sondern eine Liste vom Typ meiner Klasse (die Klasse, welche den String kapselt). Die Kapazität kann ich bis auf eine Ausnahme berechnen und die Liste direkt mit der Kapazität initialisieren. Dann würde ich die Liste per Databinding an das Control binden. Am liebsten würde ich auch noch immer zum letzten hinzugefügten Element scrollen.

Meine Fragen sind jetzt:
-Gibt es ein effizienteres Control für große Datenmengen als die ListBox?
-Soll ich lieber eine List<String> oder eine List<OnjektMitGekapseltemString> nehmen?
-Kann ich in der ListBox immer nur einen Teil der Daten anzeigen? Z.B. immer die letzten 20 der ListBox und beim scrollen dann die nächsten 20...
-Wie geht man am Besten mit solchen Datenmengen um?

Danke und Viele Grüße
Jan

25.04.2011 - 11:13 Uhr

Hallo talla,

es geht bestimmt das ich den "Codegenerierer" dazu bringen kann einen eigenen Datentyp "auszuspucken", schließlich kann ich in einem XML-Schema auch eigene Datentypen definieren. Ich denke nicht das XSD2Code damit Probleme hätte.
Die Gründe für meine Strings Collection waren:

  1. Strings enthalten Pfade(Verzeichnisse und Dateien)
  2. Faulheit, Die ganzen Controls nutzen zum anzeigen die "toString()" Methode. Ich dachte das wäre die einfachste Möglichkeit 😁
  3. (Nochmal Faulheit 😄) Das Backend ist fertig und benutzt die Collection an mehreren Stellen. Ich will das Backend nicht ändern.

Das mit dem ViewModel klingt gut. Werde ich mir anschauen. Danke.

Wünsche dir noch einen schönen Tag.
Viele Grüße
Jan

25.04.2011 - 10:18 Uhr

Ich habe jetzt eine Erklärung im Internet gefunden1. Durch den Converter wird die Quelle anscheinend nicht mehr als Collection interpretiert sondern als Objekt. Ich rufe jetzt den Refresh manuell auf.

lstMails.GetBindingExpression(ListBox.ItemsSourceProperty).UpdateTarget();

Ich finde das ziemlich enttäuschend, denn es kann nicht Ziel von DataBinding sein das ich den Refresh manuell durchführen muss X(
Den Workaround mit dem MultiBinding verstehe ich nicht. Und dann habe ich auch keine Ahnung wie ich den Workaround in meinem Fall anwenden sollte, denn der Count der Source Property entspricht in meinem Fall nicht dem Count der ListBox Property. Die ObservableCollection im Modell, kann ich ebenfalls nicht ändern denn die wird aus einem XML Schema generiert 2 . Es wäre super wenn jemand eine bessere Lösung wüsste wie einen manuellen Refresh.

Viele Grüße
Jan

24.04.2011 - 21:48 Uhr

Hallo xxxprod,

danke für deine Antwort. Ich habe jetzt einen Converter dazwischengschaltet der die einkommende ObservableCollection<string> nimmt und die Items in eine neue ObservableCollection<StringItem> kapselt. Beim ersten Start des Programmes funktioniert es auch, der Converter wird aufgerufen und alle neu eingefügten Elemente werden angezeigt. Leider funktioniert nach dem ersten Aufruf des Converters die Benachrichtigung des Bindings nicht mehr. Wenn ich in meine ursprüngliche Collection einen String einfüge, wird der Converter nicht aufgerufen. In der ListBox erscheint das neue Element nicht. Erst nach Neustart erscheinen die neuen Elemente ebenfalls. Ich glaube es liegt daran, dass ich beim konvertieren eine neue ObservableCollection<StringItem> anlege und deisen zurückgebe, ich weiß es aber nicht genau. Ich möchte ungern mein Modell ändern. Was ist an meinem Converter falsch?

Ich habe in XAML lediglich den Converter über eine Resource eingefügt und einen "DisplayMemberPath" angegeben. Das Binding mit dem Path MailDir aus dem DataContext welches die ObservableCollection<string> enthält, ist dasselbe geblieben.


<ListBox Name="lstMails" AllowDrop="True" SelectionMode="Extended" ItemsSource="{Binding Converter={StaticResource stringConverter}, Path=MailDir, Mode=TwoWay}" DisplayMemberPath="Item" Drop="lstMails_Drop" DragEnter="lstMails_DragEnter" KeyDown="lstMails_KeyDown">
</ListBox>


<UserControl.Resources>
        <local:StringConverter x:Key="stringConverter" />
</UserControl.Resources>


namespace MailSendWPF.UserControls
{
    public class StringConverter : IValueConverter
    {
        
        public object Convert(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            if (value == null) return null;
            ObservableCollection<String> stringCol = (ObservableCollection<String>)value;
            ObservableCollection<StringItem> wrappedElementsCol = new ObservableCollection<StringItem>();
            foreach (String item in stringCol)
            {
                wrappedElementsCol.Add(new StringItem(item));
            }
            return wrappedElementsCol;
        }

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

Viele Grüße
Jan

24.04.2011 - 09:51 Uhr

Hallo,

Meine Listbox ist an eine ObservableCollection gebunden. Die Collection enthält einfache strings. Die SelectionModes habe ich schon durchprobiert und auf extended gestellt. Unterscheiden sich die Strings in der Listbox funktioniert die Selektion wie gewohnt. Gibt es aber mehrere gleiche Strings in der Listbox kann ich davon nur eines auswählen. Mit STRG + linke Maustaste geht zwar auch Mehrfachauswahl, aber als selektiert wird trotzdem nur eines zurückgegeben. Ich benutze keine eigenen Templates. Alles Default.

Schöne Ostern.
Jan

17.04.2011 - 13:43 Uhr

Hallo talla,

danke, damit komme ich weiter.

"Aber die Anforderung "Fenster darf Button nicht verdecken" deutet doch stark darauf hin das nen extra Fenster gar nicht das richtige für den Fall ist."
Da hast du vermutlich recht. Platztechnisch fällt mir aber leider nichts anderes ein. Das eine Fenster das aufgeht soll, soll nur ein Ausgabefenster sein und wird immer im Vordergrund zu sehen sein sobald die Aktion startet. Ich werde auch zwei Views anbieten, eine View wo das Fenster in die Oberfläche integriert ist, dafür aber nur ein Server angezeigt wird und eine View wo ich alle Server sehe, dafür bei Start der Aktion auf bestimmten Servern für die Ausgabe je Server ein Fenster aufgeht.

Im Falle mit dem "mehrere Server" View, verdeckt das Fenster den Stop Button was nicht optimal ist. Naja, mir fällt erstmal nichts besseres ein 😃

Gruß
Jan

17.04.2011 - 00:09 Uhr

Hallo,

ich habe einen Button. Wenn ich den betätige geht ein neues Fenster auf. Leider verdeckt das Fenster den Button was ich nicht will. Das Fenster soll rechts von dem Button aufgehen. Bei "Window" gibt es ja das "Left" Property. Bei Buttons gibt es das leider nicht.
Wie bekomme ich die Position eines Buttons heraus, damit ich das Fenster entsprechend anordnen kann?

Viele Grüße
Jan

04.02.2008 - 20:58 Uhr

Vielen Dank, genau so habe ich es gemacht und es hat funktioniert.

MainWindow.XAML


<Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Tab1.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
</Window.Resources>

Aufruf:


<TabControl>
   <StaticResource ResourceKey="myTab1"/>
   (...)
</TabControl>

Tab1.XAML


<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TabItem x:Key="myTab1">
        Content... 
    </TabItem>
</ResourceDictionary>

03.02.2008 - 15:54 Uhr

Hallo,

ich benötige bei meiner Anwendung sehr viele TabItems (und es sollen noch viele hinzukommen) mit jeweils sehr umfangreichem Layout, die je nach Anwendungsfall sichtbar sein sollen. Außen herum habe ich natürlich auch eine "Verpackung" mit einigen Controls. Nun finde ich meine XAML sehr unübersichtlich.

Was ich nun möchte, ist meinen Content der einzelnen TabItems (incl. sämtlichen Controls) auf je eine XAML Datei per Tab auslagern. Leider habe ich keine Ahnung ob und wie das funktioniert, bzw. wie ich die Datei dann einbinden muss, oder als was für ein Template ich es in den TabXTemplate.XAML deklarieren muss.

Muss ich die dann als ContentControl Templates in der anderen XAML definieren?

Wichtig ist, dass ich Properties wie isEnabled oder isVisible ganz normal in meiner XAML binden kann.

Bsp:

MainWindow.XAML


(...)
<TabControl>
   <TabItem...>
         <!--Hier soll der Content aus meiner jeweiligen TabTemplate.XAML eingebunden werden-->
   </TabItem>
</TabControl>
(...)

Tab1Template.XAML


<ControlTemplate x:Key="Tab1Template">
   <Grid>
       <!-- Keine Ahnung ob das so geht und wie das gehen soll???? -->
   </Grid>
</ControlTemplate>

Tab2Template.XAML
???

Viele Grüße
Jan

02.02.2008 - 21:18 Uhr

Vielen Dank nochmal für deine ausführlichen Antworten, echt super hier!!!!!!

02.02.2008 - 20:17 Uhr

Letzte Fragen:

Wie kann ich in meinem Fall dann ein Binding in der XAML definieren?
Da kann ich ja nicht vorher über


CAppContext myAppContext = (CAppContext)FindResource("appContext");

eine Referenz auf mein Objekt holen.

Wann benutze ich ein Bindung im Source und wann in der XAML?
Gibt es da Regeln an die man sich halten kann?
Im Source macht es ja Sinn wenn sich die Datenquelle ändert, kann man es so sagen?

02.02.2008 - 19:27 Uhr

Cool, danke!!!

Dann ist also der ElementName der Name des Objektes. ElementNamen kann ich also nur benutzen wenn ich einen Namen vergeben habe.
Wenn ich also z.B. WPF Komponenten "aneinander binde" und denen einen Namen vergebe.

02.02.2008 - 18:21 Uhr

Hallo,

ich hoffe ihr könnt mir helfen. Ich versuche den Titel eines Fensters an eine Eigenschaft einer Klasse zu binden.

Ich bekomme folgenden Fehler:


System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=appContext'. BindingExpression:Path=Title; DataItem=null; target element is 'MainWindow' (Name='MyWindow1'); target property is 'Title' (type 'String')

Die Resource ist da, dass habe ich mit


CAppContext myAppContext = (CAppContext)FindResource("appContext");

überprüft.

Eigentlich soll die Resource schon in App.XAML erzeugt werden. Da soll z.B. die dem Programm übergebenen Parameter rein und da ich den Titel oft ändern muss soll der auch mit rein.

Hatte zuerst versucht die Bindung in der Mainwindow.XAML zu erzeugen, mit dem gleichen negativen Ergebnis.


Title="{Binding ElementName=CAppContext, Path=Title}"

Ich hoffe ihr könnt mir weiterhelfen.

Ausschnitt der XAML von meinem Fenster:
MainWindow.XAML


<Window x:Class="MailTest.MainWindow" Name="MyWindow1" Loaded="OnLoad"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:clr="clr-namespace:System;assembly=mscorlib"
    <!--definieren des Namespaces-->
    xmlns:src="clr-namespace:MailTest.AppContext" 
    (...)
     <!--Einfügen der Resource-->
    <Window.Resources>
     <src:CAppContext x:Key="appContext"  Title="MailTest"></src:CAppContext>
    </Window.Resources>

MainWindow.XAML.cs


 void OnLoad(object sender, EventArgs e) {
        Binding bnd = new Binding("Title");
        bnd.ElementName = "appContext";
        CAppContext myAppContext = (CAppContext)FindResource("appContext");
        Console.Out.WriteLine("AppContextIn MainWindow: " + myAppContext.Title);
         MyWindow1.SetBinding(Window.TitleProperty, bnd);
 }

Meine Klasse welche die Eigenschaft Title enthält:


namespace MailTest.AppContext {
    class CAppContext : INotifyPropertyChanged {

        private string title;

        public string Title {
            get{
                return title;
            }
            set{
                title=value;
                OnPropertyChanged("Title");
            }
        }
(...)
 public event PropertyChangedEventHandler PropertyChanged;
 public void OnPropertyChanged(String prop) {
     if (PropertyChanged!= null) {
         PropertyChanged(this, new PropertyChangedEventArgs(prop));
     }
 }