Laden...

User soll sich Gui selber zusammen klicken mit Widgets

Erstellt von liberado vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.565 Views
L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 11 Jahren
User soll sich Gui selber zusammen klicken mit Widgets

Hallo,
ich suche schon seit längerer Zeit nach einer Möglichkeit unserem Kunden eine Möglichkeit zur Verfügung zu stellen das er sich seine Gui selber zusammen klickt. Ich würde ihm gerne Widgets (Beispiel einfache Labels oder Gauges) und der Anwender soll diese in einer Art Editor wild herumschieben können und für das jeweilige Widget Werte hinterlegen können.
Was würdet ihr mit empfehlen wie ich sowas umsetzen kann ? Ich hoffe mir kann hier jemand weiterhelfen.
Vielen lieben Dank

Gruß Manuel

Gelöschter Account
vor 11 Jahren

Es gibt diverse Komponentenanbieter die sowas anbieten. Infragistics oder auch DevExpress fallen mir auf Anhieb ein. Allerdings ist die Einarbeitung mitunter problematisch da diese Komponenten praktisch nur in DataBinding Szenarien einsetzbar sind, manuelles rumpopeln geht für gewöhnlich garnicht und nicht immer funktioniert alles sauber. Gerade zu DevExpress kann ich sagen, auch wenn die dynamische UI etwas anderes sugerriert, dynamisch erweiterbare Datenstrukturen kann man praktisch vergessen. An der Stelle musst du selbst abwägen ob das für dich passt.

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 11 Jahren

Hallo Sebastian,
danke für deine Antwort. Ich habe Syncfusion bereits im Einsatz. Möchte aber von den drittanbietern ehrlich gesagt weg kommen. Hab jetzt schon einiges gelesen über WPF Widgets und Gadgets in Canvas Elementen. Aber ich bin mir noch immer nicht im klaren wie das funktionieren sollte. Es funktioniert irgendwie aber ich weis es nicht wie 😃
Was wäre denn zum Beispiel bei Infragistics ein gutes Beispiel ?
Danke und Gruß

J
641 Beiträge seit 2007
vor 11 Jahren

Schau dir das mal an: WPF Diagram Designer - Part 4

auch in SharpDevelop gibt es eine XAML Editor Komponente: SharpDevelop\src\AddIns\DisplayBindings\WpfDesign

cSharp Projekte : https://github.com/jogibear9988

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 11 Jahren

Hallo JogiBear,
vielen Dank für den Artikel. Ich hab ihn jetzt mal auf die schnelle überflogen. Es dürfte theoretisch auch möglich sein Komponenten von drittanbietern einzufügen und das Binding per CodeBehind zu setzen. Ich werde mich da jetzt mal dran versuchen. Das ganze soll meine Bachelorarbeit werden. Mal schaun was zum Schluss raus kommt 😃
Vielleicht hat noch jemand anderer wertvolle Tipps für mich ?
Danke und Lg

J
641 Beiträge seit 2007
vor 11 Jahren
Also...

Ich hab mir ne Software gebaut wo Ich das SharpDevelop Control verwende:

Einfach das "DesignSurface" Control in eine Xaml Seite einbauen...


private string baseScreen =
            "<Grid Width=\"2048\" Height=\"1536\" Background=\"White\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\r\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\r\n    </Grid>";
        

Und im Konstruktor der Seite:

   BasicMetadata.Register(); //Basic Metadata for XAMl Designer

            var xmlReader = XmlReader.Create(new StringReader(baseScreen));
            designSurface.LoadDesigner(xmlReader, null);


Das einblenden der Properties im Ext-WPF-Toolkit Property Control geht bei mir so:
(Der PropertyEditor welcher bei SD dabei ist, gefällt mir nicht...)


designSurface.DesignContext.Services.Selection.SelectionChanged += Selection_SelectionChanged;      

void Selection_SelectionChanged(object sender, ICSharpCode.WpfDesign.DesignItemCollectionEventArgs e)
        {
            var b = designSurface.DesignContext.Services.Selection.SelectedItems;
            var mainWin = App.Current.MainWindow as MainWindow;
            if (b != null && b.Count == 1)
            {
                var en = b.GetEnumerator();
                en.MoveNext();
                mainWin.PropertiesEditor.SelectedObject = en.Current.Component;
            }
            else if (b!=null && b.Count > 1)
            {
                var en = b.GetEnumerator();
                en.MoveNext();
                //mainWin.PropertiesEditor.SelectedObjects = en.Current.Component;
            }
        }

und das hinzufügen von Controls hab Ich so gelöst:

Eine Listbox mit den Controls:



     private ObservableCollection<ToolBoxItem> Controls = new ObservableCollection<ToolBoxItem>();

 lstControls.ItemsSource = Controls;

            Style itemContainerStyle = new Style(typeof(ListBoxItem));
            itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(lstControls_PreviewMouseLeftButtonDown)));
            lstControls.ItemContainerStyle = itemContainerStyle;
 

            Controls.Add(new ToolBoxItem(typeof(Button)));
            Controls.Add(new ToolBoxItem(typeof(Label)));
            Controls.Add(new ToolBoxItem(typeof(TextBox)));
            Controls.Add(new ToolBoxItem(typeof(Rectangle)));
            Controls.Add(new ToolBoxItem(typeof(Image)));


 private void lstControls_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (sender is ListBoxItem)
                //if (lstControls.SelectedItem != null)
                {
                    ListBoxItem draggedItem = sender as ListBoxItem;          
                    draggedItem.IsSelected = true;
                    var itm = draggedItem.Content as ToolBoxItem;
                    var tool = new CreateComponentTool(itm.Control);
                    if (App.DesignSurface != null)
                    {
                        App.DesignSurface.DesignContext.Services.Tool.CurrentTool = tool;
                        DragDrop.DoDragDrop(this, tool, DragDropEffects.Copy);
                    }
                }
        }

hoffe das hilft dir weiter...

cSharp Projekte : https://github.com/jogibear9988