Laden...

Forenbeiträge von Briefkasten Ingesamt 446 Beiträge

18.03.2009 - 19:21 Uhr

Das geht viel einfacher als ich dachte... die ganze Reflection arbeit umsonst.

Ich weise meinen MenuItems die Commands zu. Jetzt müssen die Commands nur noch im Datacontext vorhanden sein und falls nicht, passiert nichts.

Das ist auch ne Variante. Ich kann zwar niemand dazu zwingen, aber vom Codeaufwand ist das viel besser. Auch eine saubere Lösung wie ich meine.

Die Commands def. ich mithilfe von CommandDelegates die man mit dieser Erweiterung verwenden kann.

http://compositewpf.codeplex.com/

18.03.2009 - 07:58 Uhr

Hallo,

ich weiß immer noch nicht ganz wie ich das ganze umsetzen soll:

ich hab ein contextmenu in dem commands def. sind (löschen, bearbeiten, erstellen). ich möchte, dass jeder der mein contextmenü verwendet die commands selber festlegen muss z.b im usercontrol oder in einem window wo eben das contextmenü verwendet wird.

Nun bin ich gerade dabei folgende Lösung zu realsieren:

Das Contextmenü hat eine dependency Property ( eine normale geht auch) in dem man das HostControl übergeben muss.

Beim Initialisieren wird überprüft ob das Property belegt ist UND das HostControl von meinem Interface ableitet. Ist dies der Fall lade ich per Reflection die Interface Methoden und gebe diese in eine delegate list. Wenn man nun z.b auf Create klickt, zeigt der Delegate auf die Methode vom HostControl.

Falls jemand eine bessere Lösung oder Idee hat bitte melden.

[Edit]:

Vom Prinzip funktionierts jetzt. Ich werd diesen Lösungsweg weiter ausbauen, so lange ich keine bessere Lösung dafür gefunden habe.
lg

16.03.2009 - 18:49 Uhr

Bin ich mit dem Interface auf dem richtigen Weg?
Ich hätte eher Commands verwendet.

Hallo,

diesen Gedanke hatte ich anfangs auch. Im UserControl X funktioniert das erstellen eines Items anders wie im UserControl Y. Dann bräuchte ich theoretisch für jedes UserControl, das meine Toolbar verwendet einen vor def. Command? Lieg ich da richtig?

Ich glaube nicht, dass Interfaces Commands unterstützen. Zumindest habe ich auf die Schnelle nichts bei googel darüber gefunden.

Schnittstellen Events feuern - wie?
ist doch egal, ob die Events über eine Schnittstelle in die Klasse kommen oder aus eigenem Antrieb definiert wurden. In beiden Fällen, solltest du eine On-Methode zum Auslösen schreiben. Siehe
>
.

Du meinst es wäre besser bzw. einfacher wenn ich die Buttons public mache damit das UserControl auf die Buttonszugreifen kann und sich dann die Events Click abonniert? Geht das anmelden über Properties auch?

Kann man in einem Interface festlegen, dass man bestimmte Events angemeldet haben muss?

16.03.2009 - 18:24 Uhr

Hallo,

ich habe eine Toolbar erstellt welche 3 grundlegenden Operationen visuell darstellen (erstellen, bearbeiten und löschen – Ich verwende dazu Buttons). Nun soll man diese Toolbar in jedem UserControl verwenden können. Deshalb möchte ich, dass jeder der die Toolbar verwendet, selbst die Aktionen erstellen, bearbeiten und löschen behandelt.
Das stell ich mir so vor.
Im UserControl wird meine Custom Toolbar eingebettet. Klickt man z.B. auf den „bearbeiten“ button wird ein Click_event von der Toolbar zum UserControl / Winform oder was auch immer meine Toolbar verwendet geschickt.
Nur wie stell ich das programmiertechnisch am geschicktesten an?

Ich hätte ein Interface erstellt welches 3 Events beinhaltet. Wie feuere ich die Events im Hostprogramm? Bin ich mit dem Interface auf dem richtigen Weg?

PS: Ich arbeite mit WPF und beherberge die 3 Operation-Buttons in einem ContextMenu. So ist das Einbinden der Toolbar ein Kinderspiel.

15.03.2009 - 17:11 Uhr

Oh, stimmt. Hmm hab mich da wohl reingeritten... dass ich diesen einfachen Lösungsweg übersehen hab!

15.03.2009 - 16:16 Uhr

Hallo,

ich möchte, dass man zum MenuItem ein eigenes UserControl hinzufügen kann, anstelle vom HeaderText.

Ich hab dazu von der Klasse MenuItem abgeleitet die ein UIElement Dependency PRoperty hat. Wie kann ich das übergebene UIElement im MenuItem anzeigen lassen?

10.03.2009 - 19:08 Uhr

Hallo

danke für den aufschlussreichen Beitrag. Nachdem das TwoWay Binding nicht funktioniert, hatte ich eh sowas in richtung MVVM vor.

Das "TwoWay Binding" realisiere ich so:

private DispatcherTimer _Timer = new DispatcherTimer();

        public InformationDisplayerFacade()
        {
            //Interval auf 1 Sekunde setzen.
            _Timer.Interval = new TimeSpan(0, 0, 1);
            _Timer.Tick += new EventHandler(Timer_Tick);
            _Timer.Start();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            TicketCount = Environment.TickCount.ToString();
        }
        private string _TicketCount;
        public string TicketCount
        {
            get
            {
                return _TicketCount;
            }
            set
            {
                _TicketCount = value;
                NotifyPropertyChanged("TicketCount");

            }
        }

Jetzt muss man nur noch auf die Property TicketCount Binden 😃.

09.03.2009 - 18:49 Uhr

Hallo,

ich hab im Internet folgenden Code gefunden:

<TextBlock x:Name="_TickCount">
                <TextBlock.Text>
                    <Binding Source="{x:Static system:Environment.TickCount}" />
                </TextBlock.Text>
            </TextBlock>

Nun frag ich mich warum diese Code schreibweisen nicht funktionieren:

Text="{Binding Path=system:Environment.TickCount}" />
Text="{Binding Path=x:Static system:Environment.TickCount}" />
Text="{x:Static system:Environment.TickCount}" />

Ich hab noch mehr Varianten probiert, aber alle führen zu einem Binding Error.
Weiß jemand die korrekte Schreibweise dafür? Außerdem unterstützt x:Static kein Mode=TwoWay... Ich hätte gern, dass die Ticks laufend mit aktualisiert werden.

Gibts da vlt noch ne Variante über DataTrigger?

07.03.2009 - 17:31 Uhr

Eigentlich hätt ich auch gleich selber drauf kommen können 😄

Ich def. die Controls einfach im C# Code. Dann kann ich darauf zugreifen.

[Edit]
Ich hab gerade festgestellt, dass ich auch auf die XAML Elemente zugreifen kann ohne, dass ich die im C# Code definiert habe. Somit hat sich eigentlich der Thread erübrigt.

07.03.2009 - 17:07 Uhr

Hallo,

ich habe ein WPF Window ContentPresenterWindow erstellt in dem ein Border ist.
Dem Border habe ich im XAML den Namen _Border vergeben.

Wenn ich nun eine neue Instanz von ContentPresenterWindow erstelle kann ich nicht auf den Border zugreifen. Das kommt daher, so vermute ich, dieser keine XAML Datei hat in dem ein Border liegt. Wenn ich das Objekt ContentPresenterWindow erstelle möchte ich, dass im Window eben dieser Border (könnte genauso eine TextBox oder ein anderes Control sein) schon definiert ist.

Hat jemand eine Idee wie ich das mache?

06.03.2009 - 19:43 Uhr

@mfe Beitrag Er meint das wahrscheinlich so:

public int TextBoxLenght
{
get{return _TextBox1.Text.Lenght}
set{}
}

Ne andere Idee wäre das mittels OneWay Binding zu lösen.

05.03.2009 - 22:31 Uhr

Um den Änderungsmechanismus der Bindings zu nutzen muss man die Variablen als DependencyProperties implementieren.

Das Stimmt nicht ganz. Man kann genauso gewöhnliche Properties verweden. Allerdings müssen die Public und get & setter habe/sein.

[...]DependencyProperty
http://msdn.microsoft.com/de-de/library/ms749011.aspx
Ein Zweck einer angefügten Eigenschaft besteht darin, es verschiedenen untergeordneten Elementen zu ermöglichen, eindeutige Werte für eine Eigenschaft anzugeben, die eigentlich in einem übergeordneten Element definiert ist. Eine spezielle Anwendung dieses Szenarios ist zum Beispiel, wenn untergeordnete Elemente das übergeordnete Element darüber informieren, wie sie in der Benutzeroberfläche (user interface, UI) dargestellt werden sollen.
[/]

In dem du den DataContext setzt kannst du auf die vorhandenen Properties** im XAML** zugreifen.
http://msdn.microsoft.com/de-de/library/system.windows.frameworkelement.datacontext.aspx

Hier ein Beispiel:

namespace WpfApplication1
{
    public class test 
    {
        public string Artikelname { get; set; }
        public string Foto { get; set; }
    }
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public test Test { get; set; }
        public string Propertyname { get; set; }
        public Window1()
        {
            InitializeComponent();

            this.Test = new test();
            this.Test.Artikelname = "lol";
            this.Propertyname = "Text für TextBlock";
            

            this.DataContext = this;
        }
    }
}

Im Window gibt es 2 Properties. Test und Propertyname beide sind public und haben getter und setter.
Mit this.DataContext = this übergeben wir dem DataContext die aktuelle Instanz vom Window1. Im Window1 sind oben eben diese 2 Eigenschaften definiert. Deshalb kannst du nun im XAML auf diese zugreifen. Das machst du so:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <StackPanel Orientation="Horizontal">
        <TextBox Name="_TextBox1" Text="{Binding Path=Test.Artikelname}" />
        <TextBlock Name="_TextBlock" Text="{Binding Path=Propertyname}"></TextBlock></StackPanel>
    </Grid>
</Window>

Bei dir funktioniert das Binden auf vorname nicht, weil vorname bei dir kein Propertie ist. Du must myTest in eine Propertie geben und als DataContext die aktuelle Instanz angeben, so wie in meinem Beispiel oben angeführt. Natürlich gibt es noch weitere möglichkeiten...

[Edit:]

Achso du gibst im DataContext myObject an. Dann ist das was anderes. Schau ob die Properties öffentlich und getter und setter haben.

Ich hab das bei mir getestet und es funktioniert.

namespace WpfApplication1
{
    public class test 
    {
        public string Artikelname { get; set; }
        public string Foto { get; set; }
    }
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            test Test = new test() { Artikelname = "lol", Foto = "Foto1.jpg" };
            this.DataContext = Test;
        }
    }
}
    <Grid>
        <StackPanel Orientation="Horizontal">
        <TextBox Name="_TextBox1" Text="{Binding Path=Artikelname}" />
        <TextBlock Name="_TextBlock" Text="{Binding Path=Foto}"></TextBlock></StackPanel>
    </Grid>
05.03.2009 - 20:17 Uhr

Hallo,

wie setzt ihr die Editierfunktion optimal in Formularen um? Ich hab beispielsweise eine ListBox in der alle Einträge angezeigt werden. Schaltet der Benutzer auf editieren um und hat die Rechte dazu wird eine Flag auf true im Codebehind gesetzt.

Das DataTemplate für die ListBox beinhaltet einen TextBlock mit Visibility = Visibel, zum Anzeigen der Werte. Zusätzlich habe ich eine TextBox, damit man später den Wert bearbeiten kann. Allerdings ist die Visibility der TextBox standardmäßig auf Collapsed gesetzt.
Im DataTemplate für die ListBox will ich per DataTrigger diese Flag holen und überprüfen. Dann setze ich die Visibility jeweils wie gebraucht - bei bearbeiten TextBox anzeigen sonst TextBlock. Wie aber kann ich auf diese Flag im DataTrigger zugreifen.

Ich hab eine Attached Propertie als Flag verwendet. Ich kann aber nicht auf die Flag zugreifen. Ich erhalte die Meldung, dass er die Propertie nicht findet. In der ListBox kann ich aber auf die Attached Propertie zugreifen.

Hat jemand eine Idee, wie ich im DataTrigger auf das Flag zugreifen kann? Oder gibt es eine einfachere Lösung?

02.03.2009 - 21:35 Uhr

Hallo Leute,

Meine Frage:
Wie Programmiere ich ein Programm wie das Visual Studio selber. Mit einer Output Box untern, sowie rechts und links dialog boxen?

Das kannst du in dem du ein eigenes Control erstellst. Mit WPF hast du so ein Control in wenigen Minuten erstellt.

Frage2:
Gibt es irgend ein Handbuch, das .NET Framework richtig erklärt? Das ist so wie der unterschied zwischen einer Fachhochschule und einer Universität. Die auf der Fachhohschule bekommen alles fertig zum auswendiglernen vorgekaut. An der Universität wird einem erklärt wie es hergeleitet wird. Was ich brauche ist eine Anleitung wie an der Universität. Ich will wissen wie das ganze vom grund auf funktioniert, damit ich selber mehr einfluss habe.

Danke

Es gibt viele Bücher die C# gut erklären. Wie man was programmiert. Mir scheint du willst hinter die Kulissen von .NET blicken. Was macht/ wie funktioniert die Methode x/y.. Was passiert im compiler wenn man das Schlüsselwort partial verwendet(Nur als Beispiel).

Einer der Vorteile von .NET bzw. C# ist, dass man sich auf das wesentliche Problem lösen konzentrieren kann und sich nicht mit Hardware, Betriebsystem nahen Programmier-Problemen herum plagen muss.

Einzelne Libarys des .NET Framework sind übrigens "OpenSource"
http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx

Ansonsten must du dir Assembler, C... an tun.

28.02.2009 - 17:24 Uhr

Unter WindowsForms ist es nicht sonderlich einfach eigene Designvorstellungen
in seine SW zu bringen, in WPF ist es einfach.

Genau das ist der springende Punkt. Ich gehe jede Wette ein, dass der Trend bei Firmen in die Richtung geht, dass man Themes für StanardControls wie TextBox, RadioButton etc. schreibt. Da fängt das Ganze schon an.

28.02.2009 - 16:08 Uhr

Hallo,

in der Windowswelt waren die GUI Oberflächen zu 99% Einheitlich. Man wusste wo man welche Optionen fand und wie man diese zu bedinen hatte. Außerdem gab es so etwas wie ein erkennungsmerkmal. Eine TextBox sieht in jedem Windows Dialogfeld gleich aus. Auch bei Drittherstellern.

Die Menüleiste (Datei, Bearbeiten) ist immer ganz oben im Windows Fenster zu finden.

Das hat sich leider seit Windows Vista, Office 2007 geändert. Dieses Einheitliche geht mit diesen neuen Produkten und der Technologie WPF verloren.

Das fand ich auch schon unter Linux sehr unsympatisch. Diese vielen unterschiedlichen Styles der Controls, die in jedem Programm anderst angeordnet sind.

Dadurch, dass man mit WPF eine TextBox vollkommen anderst ausschauen lassen kann geht eben genau dieses Einheitliche verloren. Ich glaube, dass all die oben positiv angeführten Eigenschaften einer GUI mit WPF verloren gehen.

Was meint ihr zu diesem Thema? Seht ihr eine positive Entwicklung mit WPF UserInterface und Ergonomie?

lg

27.02.2009 - 16:30 Uhr

Wie erstellst du denn das untergeordnete Control bzw. weist es dem übergeordneten als Child hinzu?

Was ist denn letztendlich dein Ziel?
Eventuell lässt sich dieses auch einfacher erreichen.

Die untergeordneten Controls binde ich im Root UserControl über XAML ein und zwar so:

<UserControl.Content>
[...]
<StackPanel>
<local:FilterControl  x:Name="_filtercontrol" ItemSource="{Binding Path=Facade}" ></local:FerienFilterControl>
</StackPanel>[...]

RootUser Control setze ich den DataContext.

Wenn ich jetzt in eines der untergeordneten UserControl "rein" debugge haben die alle den Datacontext vom RootElement geerbt.

Obwohl ich den DataContext der untergeordneten UserControls neu setze, sprich zuerst auf NULL setze und dann den richtigen DataContext, stimmt das Binding nicht.

Das sieht man z.B. am Output vom untergeordneten UserControl:

System.Windows.Data Error: 39 : BindingExpression path error: 'Order' property not found on 'object' ''Source' (HashCode=59641681)'. BindingExpression:Path=Order1; DataItem='Source' (HashCode=59641681); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

'object' Source ist nur im Root UserControl vorhanden. Stattdessen sollte das Control nur im eigenen DataContext "suchen".

Der TextBlock vom Untergeordneten Control zeigt mir trotzdem den Inhalt vom Property Order1 an, da es die ItemSource bzw. den DataContext von sich verwendet. Es scheint als würde das Programm zuerst im Datacontext vom RootControl nach dem Property suchen. Weshalb es auch zum Binding Error kommt, so vermute ich.

Wurde die Eigenschaft nicht gefunden sucht es erst im eigenen Control (also im Untergeordneten).

Dieses Fehlerverhalten ist der springende Punkt warum ich nicht möchte, dass der DataContext an die SubControls vererbt wird.

Ich hoffe ich hab mich so ausgedrückt, dass mich jeder versteht. Ansonsten einfach nachfragen. 😃

lg

24.02.2009 - 17:37 Uhr

Hallo,

wie meinst du das mit explizit setzen? Ich mach das in meiner ItemSource.

        public IList<Class> ItemSource
        {
            get { return (IList<Class>)GetValue(_ItemSourceProperty); }
            set { SetValue(_ItemSourceProperty, value); }
        }
        public static readonly DependencyProperty _ItemSourceProperty =
            DependencyProperty.Register("ItemSource", typeof(IList<Class>), typeof(UserControl1), new UIPropertyMetadata(null, OnItemSourceChanged));
        private static void OnItemSourceChanged(DependencyObject pDependencyObject, DependencyPropertyChangedEventArgs e)
        {
            IList<Class> ListClass = e.NewValue as IList<Class>;
            UserControl1 userControl = pDependencyObject as UserControl1;

            if (ListClass != null && userControl != null)
            {
                userControl.DataContext = ListClass;
            }


        }

Wenn diese DP Eigenschaft in einem untergeordneten UserControl wäre, wäre der DataContext bereits vorhanden und zwar vom RootUserControl. Das will ich vermeiden. Ist der DataContext von einem untergeordnetem UserControl noch nicht gesetzt soll, dieser auch NULL sein.

Ansonsten, arbeite mit dem falschen Datacontext und wenn ich, dann das UserControl wo anderst einbinde, funktionierts nicht mehr.

24.02.2009 - 15:48 Uhr

Hallo,

Ich habe ein UserControl1 und UserControl2. Das UserControl2 ist in UserControl1. Wenn ich den DataContext in UserControl1 setze hat UserControl2 ebenfalls diesen DataContext. Ich will aber nicht, dass dieser geerbt wird. Hat jemand eine Idee was ich da machen kann um dies zu verhindern?

20.02.2009 - 19:07 Uhr

Hallo,

ich hatte neulich in einem Projekt ein Control, ich sag mal dazu HauptControl, das von mehreren Parameter abhänig war. Insgesamt konnte man die Parameter auf Filter und Sortieren Gruppen zusammenfassen.

Nun hab ich mir die Frage gestellt wie ich das realisieren soll. Es 2 Möglichkeiten:

1.) Ich erstell ein Control und mach die Sortier / Filter Geschichten mittels DataTemplate in eben dieses eine Control rein auf dem sich das Hauptcontrol befindet um es mit Daten zu füttert.

2.) Ich erstell für die Filter / Sortier sachen jeweils ein Control und mach die nacher auf ein weiteres Control(oder auch Window) wo auch das Hauptcontrol ist.

Hinzufügen muss ich, dass jeweils zu den Filter und Sortier Eingaben CodeBehind erstellt werden muss egal ob ich jetzt ein Control oder ein DataTemplate mache.

Wenn ich mich für 2teres entscheiden würde, also jeweils ein Control erstellen, könnte ich diese nur einmal gebrauchen (Zumindest jetzt).

Wann sollte man eurer Meinung nach Controls in WPF erstellen?
Ich würde das tun, wenn man
Controls öfter braucht
Um komplexität zu wahren
Sprich Sortier Code nicht mit Filter Code mischen

Was meint ihr?

18.02.2009 - 18:16 Uhr

Hallo,

ich würd mal sagen das geht gar nicht. Dafür solltest du ein UserControl erstellen.

10.02.2009 - 21:10 Uhr

Hallo,

gibt es eine möglichkeit, herauszufinden, in welcher property man sich gerade befindet.

z.B.

public string FirstName
        {
            get
            {
                return _FristName;
            }
            set
            {
                _FristName = value;
                string propname = PersonPrivatFunctions.GetPropertyName();
                NotifyPropertyChanged( propname  );

            }
        }

Hat jemand eine idee? Einen ansatz habe ich schon gefunden. http://www.csharp-examples.net/reflection-property-names/
Nur bekomme ich so alle propertynames zurück. Hat jemand eine idee?

04.02.2009 - 20:03 Uhr

Hallo,

ich will eine Eigenschaft von meiner Klasse an eine TextBox binden.
Das habe ich so gemacht:

private goList _golist = new goList(); //inerhert observercollectionlist<go>
 
 
        public Window1()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            _golist .Add(new go(DateTime.Now.AddDays(0),1));
            _golist .Add(new go(DateTime.Now.AddDays(1),0));
            Binding binding = new Binding();
            binding.ElementName = _golist[0].ToString();
            binding.XPath = "_golist/[0]/Day";
            textBox1.SetBinding(TextBox.TextProperty, binding);
 
 
        }

Leider bekomme ich da immer die Fehlermeldung:

Cannot find source for binding with reference ElementName Window1.go 04.02.2009 1.
Ich bin mir sicher, dass der XPath nicht stimmt. Weiß jemand wie der Richtig lauten muss? Ich will auf die Eigenschaft _golist[0]Day binden.

04.02.2009 - 19:58 Uhr

Anscheinend geht das nicht, dass mein für seinen Typ den man als Item verwendet ein DataTemplate macht. Man muss genau für die Cell, sprich wo man den Typ reinladet, das DataTemplate def.

03.02.2009 - 17:30 Uhr

Hallo,

ich habe eine ListView. Diese fülle ich mit einer observer collection<meindatentyp>, per ItemSource.

für meindatentyp habe ich ein DataTemplate definiert. Das DataTemplate funktioniert aber nur im Control Itemcontrol. In der ListView wird das DataTemplate nicht verwendet. Muss ich in der ListView ein Template für ColumnCell machen, welches genau gleich ausschaut, wie das von meinem meindatentyp DataTemplate?

lg

31.01.2009 - 10:01 Uhr

Hallo,

ich hab mal vor ein paar Jahren mir http://vsphp.de/ angeschaut, damals war er aber ein bisschen buggy. Er unterstützt Debugging, IntelliSense etc. Jetzt sollte er ausgereift sein.

Achja die IDE ist im VS.NET integriert.

28.01.2009 - 18:54 Uhr

Hallo,

ich verwende das datagridview vom WPF toolkit.

Unter ItemSource kann man eine Quelle binden.

Ich habe eine eigene Klasse in der ich meine Daten gespeichert habe. Wie stelle ich es nun an, dass ich diese Klasse als ItemSource angeben kann?

Diese Problem tritt sehr häufig auf, es könnte sich z.B. um ein anderes Control handeln.

Wichtig dabei ist, dass die synchronisation zwischen DataSource und Control stimmen.

Gibt es dazu, ein allgemein bewährtes Rezept?

Ich hätte folgende Lösungsansätze:

Meine Klasse in ein xml objekt serialisieren und als DataSource angeben
-Nicht alle Controls unterstützen beim Binding XML Objekte.
Klasse schreiben welche als Wrapper fungiert, baut mit den vorhandenen Daten welche sich in meiner Klasse befinden das Control zusammen (z.B. Rows, Columns etc) und syn meine Klasse bzw. Control ständig .
-sehr viel arbeit, fehleranfällig
Funktion schreiben die Objekt/Typ erstellt welche beim Binding erwartet wird (ähnlich wie bei Punkt 2)
-fehleranfälllig, Kein Zugriff auf Basis Events/Funktionen von ursprünglicher Klasse

habt ihr eine bessere Idee?

25.01.2009 - 16:26 Uhr

Hallo,

ich habe dieses Tutorial gemacht:
http://www.codeproject.com/KB/cs/pluginsincsharp.aspx (Allerdings in einem WPF Projekt). Ich habe in meiner MainForm eine Textbox. Ich will, dass nun das Plugin, auf die TextBox der MainForm zugreifen kann.

In meiner MainForm habe ich eine m_textBox1 Textbox der ich einen neuen Wert zuweisen will. Bei der MainForm habe ich ein Singelton implementiert und kann diese über GetInstance() aufrufen.

1.) Im Plugin, wird auf die Textbox wie folgt zugegriffen:

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            this.Host.TextBoxWindow = "asfsafasdf";
        }

2.) Der PluginService (PluginService.cs) hat diese Eigenschaft wie folgt def.

        public string TextBoxWindow
        {
            get
            {
                return Taschenrechner.MainFormWindow.GetInstance().TextBoxWindow;
            }
            set
            {
                Taschenrechner.MainFormWindow.GetInstance().TextBoxWindow = value;
            }
        }

3.) Über die Funktion GetInstance.TextBoxWindow gelangt man dann zur
dieser Eigenschaft und kann den Wert der m_textBox1 setzen.
MainForm.xaml.cs:

public string TextBoxWindow
        {
            get
            {
                return this.m_textBox1.Text.ToString();
            }
            set
            {
                this.m_textBox1.Text = value;
            }
        }

Das komische ist, der Debugger Zeit bei value den Wert vom Plugin an. Auch sehe ich im Debugger, dass die m_textBox1.Text den Wert übernommen hat.

Wenn ich das Programm nach dem setzen der Eigenschaft weiter laufen lasse,steht immer noch kein Wert in der TextBox. Wie kann das sein? Woran könnte das liegen?

18.01.2009 - 14:09 Uhr

Hallo,

ich habe einen Blog eintrag gefunden, in dem ein ansatz für ein GantChart Projekt gegeben wird.

Siehe: http://blog.functionalfun.net/2008/09/how-to-create-gantt-control-in-wpf.html
http://blog.functionalfun.net/2008/09/how-to-create-gantt-control-in-wpf-part.html

Allerdings fehlt hier eine TimeScale (So wie im MS Project). Hat jemand eine Idee wie ich die dazu machen könnte?

Ich hätte die TimeScale mit einem canvas Controll erstellt, und die TimeLine gezeichnet. Etwas besseres fällt mir momentan nicht ein. Allerdings müsste ich, dann noch einen Weg finden, wie ich die TimeLine mit den Tasks synchronesiere.

Die Taskszeiten, müssen ja dann mit meiner TimeScale übereinstimmen.

Habt ihr noch eine Idee?

14.01.2009 - 21:04 Uhr

Hallo,

ich suche ein WPF Control, welches Balkendiagramme wie in MS Project erstellt. Voraussetzung ist man kann Balken in der gleichen höhe hintereinander setze. Das funktioniert leider bei dem Control von D lhsoft nicht. Sonst wäre, dieses ideal.

In der Suche habe ich leider nur Controls für WinForms gefunden.

lg

12.01.2009 - 18:18 Uhr

...Denn beim MenuContextOpening steht ein ContextMenuEventArgs zur Verfügung, welcher auch die Eigenschaft OrginalSource enthält.

Hallo, das Control ist von einem Dritthersteller, as Event heißt nur zufällig MenuContextOpening. Ein ContextMenuEventArgs gibt es leider nicht. 😦

Da werd ich wohl ein eigenes Event schreiben müssen, ohne dass dieses an ein anderes Event gekoppelt ist, so wie ich es vorher probiert habe.

12.01.2009 - 12:44 Uhr

Hallo,

ich hab bei einem benutzerdefinierten Control 2 Events vorgegeben. Dieses Benötigt den MenuContextOpeningEventHandler. Im Event selber habe ich bei der Variable e nur den Typ EventArgs zu verfügung.

Ich würde einige Eigenschaften vom MouseDownEventArgs (so ähnlich hieß der glaub ich) benötigen. U.a. die Eigenschaft OrginalSource.

Als erstes hab ich probiert im Event MenuContextOpening das Event MouseDownEventArgs auszulösen(in dem wären die Eigenschaften drinnen die ich benötige). Dieser erwartet aber statt dem EventArgs MouseDownEventArgs. Ein Cast hat nicht funktioniert.

Also hab ich mir gedacht, ich erstell einfach mein eigenes Event. Allerdings musste ich beim Event erstellen wieder den EventArgs zu MouseDownEventArgs casten.

Hat jemand eine Idee, was ich da machen kann? Gibts da ne andere mir unbekannte möglichkeit das Din zu Casten? Oder kann man das EventArgs irgendwie austauschen?

09.01.2009 - 12:19 Uhr

Hallo,

unter WPF funktioniert, das DialogResult anscheinend anderst.

Denn wenn ich:

if(MessageBox.Show("asfsdf","asf",MessageBoxButton.YesNo,MessageBoxImage.None).Equals(DialogResult.HasValue && DialogResult.Value))
    //todo

schreibe, und bei der MessageBox Yes drücke ist Value und HasValue immer false.

Kann mir jemand sagen, was ich da falsch mache?

lg

08.01.2009 - 22:11 Uhr

Verwende statt einem Panel einen Grid.

Hallo,

danke für den Tipp, dann erhalte ich allerdings wieder die Meldung:

Beim Inhalt von "ContentControl" muss es sich um ein einzelnes Element handeln.

            this.AddChild(m_grid); //hier InvalidOperationException


            m_grid.Children.Add(m_tasklistview);
08.01.2009 - 22:01 Uhr

Ich verwende ein Controll von einem Dritthersteller.

In TaskListView m_tasklistview = new TaskListView(); sind anscheinend mehrere.

Denn wenn ich this.AddChild(m_tasklistview) mache, erhalte ich eine Exception, dass ich nur ein Controll übergeben darf.

Also hab ich mir gedacht, gut, dann erstell ich eben dyn. ein Panel, und füge, die m_tasklist hinzu.

Der Code:


        private Panel m_panel = new Panel();
        private TaskListView m_tasklistview = new TaskListView();

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.Width = 800;
            this.Height = 800;
            this.Title = "Chart";

            m_panel.Children.Add(m_tasklistview);
            this.AddChild(m_panel);

        }

this.AddChild(m_panel); funktioniert. Aber das m_panel.Children.Add nicht, weil m_panel NULL ist. Ich erhalte beim Compilieren bei der Code Zeile

private Panel m_panel = new Panel();

Die Fehlermeldung:

Fehler	1	Es konnte keine Instanz der abstrakten Klasse oder Schnittstelle erstellt werden.

Was kann ich da noch probieren?

08.01.2009 - 18:16 Uhr

Hallo,

wie kann ich ein dyn. erzeugtes Control zu meinem Window wpf hinzufügen. Im Internet steht, ich kann das über Children.Add() machen. In meiner Intellisense wird mir diese Funktion, bei this, nicht angezeigt.

Hat jemand eine Idee wie ich das noch machen kann?

08.12.2008 - 16:25 Uhr

Hallo,

das glaub ich eben auch, dass der xaml Code den Konstruktor aufruft. Ich habe erst kürlich mich mit WPF beschäftigt und weiß nicht wie ich den xaml Code abändern muss, damit er meine GetInstance Methode aufruft.

<Application x:Class="Taschenrechner.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Forms/MainForm.xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>

[Edit]
Hab den Beitrag zufällig wieder gefunden mit der Lösung. Die Funktion GetInstance muss man in der App.xaml.cs im Event OnStartup aufrufen. Das Fenster erstellt man dann im Code. In der App.xaml muss man die StartupUri noch entfernen und man hat eine XAML Singleton anwendung.

Genauer beschrieben ist das noch hier:

http://get-the-solution.net/index-blog-1-14-46-Singleton-unter-WPF-C#

08.12.2008 - 15:52 Uhr

Hallo,

ich will das Entwurfsmuster Singleton in meinem WPF verwenden. Ich hab das theoretisch auf Wiki gelesen und bin so weit gekommen:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
 
namespace Taschenrechner
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        MainFormWindow m_main = MainFormWindow.GetInstance(); 
    }
}

namespace Taschenrechner
{
    /// <summary>
    /// Interaction logic for MainForm.xaml
    /// </summary>
    public partial class MainFormWindow : Window
    {
        private static MainFormWindow m_MainFormWindow = null;
 
        #region Funktionen
        /// <summary>
        /// Konstruktor
        /// Singleton - Es verhindert, dass von einer Klasse mehr als ein Objekt erzeugt werden kann. 
        /// Dieses Einzelstück ist darüber hinaus üblicherweise global verfügbar.
        /// </summary>
        private MainFormWindow()
        {
            InitializeComponent();
        }
        public static MainFormWindow GetInstance()
        {
            if (m_MainFormWindow == null)
            {
                m_MainFormWindow = new MainFormWindow();
            }
            return m_MainFormWindow;
        }
 
        #endregion

Ich erhalte aber immer die Fehlermeldung :

Das Objekt vom Typ "Taschenrechner.MainFormWindow" kann nicht erstellt werden. Bei "CreateInstance" ist ein Fehler aufgetreten; möglicherweise ist für "Taschenrechner.MainFormWindow" kein öffentlicher Standardkonstruktor vorhanden. Fehler in Markupdatei "Forms/MainForm.xaml", Zeile 1, Position 9.

Wenn ich den Konstruktor aber public mache, kann man beliebig viele Instancen machen. Wie kann ich das verhindern?

27.10.2008 - 18:15 Uhr

Hallo,

ich will ein Ortungssystem erstellen. Es gibt einen Sender und Empfänger.

Ich such nun einen passendes GPS-Gerät, dass SDK und eine Platine zum den Chip flashen mitliefert. Hat wer gute ERfahrungen mit einem gewissen Typ?

Kann mir jemand Empfehlungen abgeben?

01.10.2008 - 12:59 Uhr

Hallo,

ich habe mehrere Fenster in meiner Anwendung. Früher habe ich jedem Fenster die Eigenschaften einzeln zu gewiesen. Nun kam mir die Idee ich könnte diese Eigenschaften bzw. den Styl zentral "irgendwo" speichern. D.h. ich stelle die Eigenschaft Background um und prompt haben alle Fenster die selbe Hintergrundfarbe in meiner Applikation. Vlt. wäre es möglich, dass man ganze Controls zum Styl hinzufügt. Somit könnte man im nach hinein einen "Zurück" Button zu den Fenster hinzufügen.

Diesen Styl würde ich in eine XML Datei speichern. Abe wie sieht das Programmtechnisch aus, dass die WPForms, sich der XML eigenschaften annehmen.

Hat jemand eine Idee wie man sowas hin bekommt oder einen Denkansatz.

lg

06.08.2008 - 19:40 Uhr

Okay habs, danke für den Tipp.

StoppUhr.Properties.Resources.resources

ist das nicht etwas seltsam?

Wenn ich über die GUI die Resource anschaue steht da beim Icon als Dateiname App und auch im Propertiefenster wird als Dateiname App angezeigt.

06.08.2008 - 18:39 Uhr

Hallo,

ich hab in meiner Assembly ein Icon namens App gespeichert. Mein Projektname heißt StoppUhr.

Nun versuche ich mit

System.IO.Stream theStream = m_currentAssembly.GetManifestResourceStream("StoppUhr.App");

das Icon in den Stream zu laden. Ich bekomme aber von der Methode immer NULL zurück.

Auf allen Internet-Seiten steht, dass man an die Ressource mit Projektname.Ressourcename rankommt. Das hab ich gemacht, allerdings stimmt, da was andres nicht. Hat jemand eine Idee?

PS: Mit StoppUhr.App.ico hab ichs auch schon probiert.

28.07.2008 - 21:28 Uhr

verwendetes Datenbanksystem: mssql express 2005

In meinem Datagridview ist eine spalte die checkboxes enthält. Ändert man den Status der checkbox auf checked soll in der Spalte/Zeile "daneben" das aktuelle Datum eingetragen werden.

Wird eine Checkbox unchecked soll das Datum aus der Spalte daneben gelöscht werden.

Ich hab das wie folgt probiert.


/// <summary>
        /// Rausfinden ob in Spalte Abobezahlt(Checkboxes) geklickt wurde. Wenn ja aktuelles Datum in Spalte [Abobezahlt am]
        /// eintragen.
        /// </summary>
        /// <param name="sender">Gibt an von welchem Objekt Ereigniss ausgelöst wurde.</param>
        /// <param name="e">Stellt Daten für das DataGridView-Ereignisse  in Verbindung mit Zellen- und Zeilenoperationen bereit.</param>
        private void m_dataGridView1Abo_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (m_dataGridView1Abo[e.ColumnIndex, e.RowIndex].OwningColumn.Name.Equals("Abobezahlt"))
                if (m_dataGridView1Abo[e.ColumnIndex, e.RowIndex].Value.Equals(false))
                    if (m_dataGridView1Abo[e.ColumnIndex + 1, e.RowIndex].Value.GetType().Equals(typeof(DBNull)))
                    {
                        m_dataGridView1Abo[e.ColumnIndex, e.RowIndex].ReadOnly = false;
                        m_dataGridView1Abo[e.ColumnIndex, e.RowIndex].Value = true;
                        m_dataGridView1Abo[e.ColumnIndex + 1, e.RowIndex].Value = DateTime.Now.ToShortDateString();
                    }
                    else
                    {
                        m_dataGridView1Abo[e.ColumnIndex, e.RowIndex].Value = false;
                        m_dataGridView1Abo[e.ColumnIndex + 1, e.RowIndex].Value = DBNull.Value;
                    }
        }

Wurde mit der Maus der Status der Checkbox geändert, wird das Event zu früh aktiv. Sprich m_dataGridView1Abo[e.ColumnIndex, e.RowIndex].Value stimmt nicht. Erst nach dem das Event abgearbeitet wurde, stehen die geänderten Werte (die der User mit der Maus durchgeführt hat) in m_dataGridView1Abo[e.ColumnIndex, e.RowIndex].Value. Ich brauch ein Event namens CellClicked oder etwas ähnliches.

Hat jemand eine Idee?

28.07.2008 - 21:15 Uhr

Hallo,

als kleine Anmerkung:

http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlconnectionstringbuilder(VS.80).aspx


try
            {
                m_stringbuilder = new SqlConnectionStringBuilder();
                m_stringbuilder.DataSource = db.dbhost // z.b. computername\SQLEXPRESS;
                m_stringbuilder.InitialCatalog = db.dbname //dbname;
                
                if (integratedSecurity.Equals(false))
                {
                    m_stringbuilder.UserID = db.username;
                    m_stringbuilder.Password = db.pw;
                }
                m_sqlcon = new SqlConnection(m_stringbuilder.ToString());
...

15.07.2008 - 09:26 Uhr

Hallo,

wie kann ich Module für mein Programm erstellen? Ich stell mir das so vor, in einem Verzeichnis sind alle Bibliotheken. Diese werden, dann dyn. zur Laufzeit geladen. Über Schnittstellen im Programm, können die Bibliotheken zu Kontextmenüs Einträge hinzufügen, Menüeinträge machen, etc.

Hat jemand ein konkretes Beispiel? Ich finde nichts passendes zum Thema.

01.07.2008 - 12:46 Uhr

verwendetes Datenbanksystem: MSSQL EXPRESS ADV

Hallo,

ich mache gerade eine Software mit der man Kontakte Rechnungen usw. verwalten kann.

Nun steht im Pflichtenheft u.a., dass bestimmte Rechnungen und Kontakte nur von bestimmten Benutzer(gruppen) bearbeitet werden dürfen.

Soll ich die Benutzerverwaltung/Rechte usw. in Tabellen speichern, oder über die Windowsbenutzer abwickeln.

Das Programm wird auf bis zu max. 50 Rechnern eingesetzt. Als Betriebsystem kommt Windows XP zum einsatz. Die Rechner befinden sich in keiner Windows Domäne (wobei das später möglich wäre).

Wie würdet ihr das machen?

mfg

03.06.2008 - 10:20 Uhr

du könntest 2 membervariablen für die Schriftart erstellen.

im Konstruktor setzt du die membervariablen. Im doc_PrintPage greifst du, dann auf die 2 Schriftarten zu.

Falls du eigene Parameter beim PrintPage angeben kannst, vergiss die membervariablen und mach das über die Parameter.

Oder meintest du was anderes?

28.05.2008 - 20:39 Uhr

verwendetes Datenbanksystem: mssql express

Hallo,

um das DataGridView mit Inhalt zu füllen geh ich wie folgt vor:

1.) SP ausführen die folgendes Select Statment zurück gibt:

SELECT   AboRechnungen.AboRechnungsnr ,AboRechnungen.[AboRechnung erstellt am], AboRechnungen.Abobezahlt, AboRechnungen.[Abobezahlt am], 
			Abonnenten.Gratis, Abonnenten.Aboid AS Aboid, Abonnenten.[Abo Jahr]
			FROM         Abonnenten LEFT JOIN
			AboRechnungen ON Abonnenten.Aboid = AboRechnungen.Aboid
			Where Abonnenten.Aboid = dbo.Abonnenten_GetAboId(@kontatkid)

2.)DataTable DataGrid zu weisen.

Wie kann ich jetzt die Änderungen die der Benutzer in der DataGridView vornimmt in die DB zurück speichern?

23.05.2008 - 20:55 Uhr

Ich hab den Fehler in der SP gefunden, die Spalte wurde wie folgt selected

CONVERT(varchar, (Abonnenten.[Abo Jahr]),101) AS [Abo Jahr]

Das erklärt alles.

23.05.2008 - 15:52 Uhr

verwendetes Datenbanksystem: Ms SQL express

Hallo,

ich führe eine SP aus die mir eine DataTable zurück gibt die den falschen DatenTyp hat. In der Db gibt es eine Spalte "Abo Jahr" welche den Datentyp DateTime hat.

Mit dieser Funktion erhalte ich von der SP die DataTable:


internal DataTable ExecuteStoredProcedureReturnDataTable(string p_StoredProcedureName, List<object[]> p_parameters)
        {   
            SqlConnection _sql = m_sqlcon;
            SqlCommand _cmd = new SqlCommand(p_StoredProcedureName, _sql);
            _cmd.CommandType = CommandType.StoredProcedure;
                 SqlDataAdapter _adapter = new SqlDataAdapter(_cmd);
                DataTable _dt = new DataTable();
                _adapter.Fill(_dt);

                return _dt;
            }
            catch (Exception _exc)
            {
                System.Diagnostics.Debug.WriteLine("In Datei: db.cs In Funktion: ExecuteStoredProcedureReturnDataTable, Fehlermeldung :" + _exc.Message);
            }
            return null;
        }

Kann mir wer sagen... warum die Spalte Abo Jahr in der DataTable immer den Datentyp string hat?

mfg