Avatar billede montago Praktikant
10. november 2007 - 17:34 Der er 8 kommentarer og
1 løsning

Windows application : DockPanel : Oprette et property panel ?

Jeg er igang med at lave et windows program, hvor jeg gerne vil lave noget der minder om VisualStudio's property panel

det skal ikke kunne flyttes rundt, men blot vises/opdateres når jeg vælger en item fra min canvas.

krav:
1. Property panelet skal have en fast bredde
2. panelet skal indeholde nogle dropdown boxe (hvis muligt)
3. panelet skal indeholde nogle text-felter

panelet skal justere ændringer på nogle objekter jeg har lavet - dvs ændre via GET/SET'ers
fx. Obj.name = "navn"

dropdowns skal bruges når jeg fx skal ændre properties på mit object, hvor der benyttes Enum's


// program: ///
public class MyWindow : Window{
            Title = "Class Diagram Program.";
            Background = new SolidColorBrush(Color.FromRgb(80, 80, 80));
           
            canvas = new Canv();
            dock = new DockPanel();
           
            Content = dock;

            #region Top Docked: MENU
            if (true)
            {
                // Create menu.
                menu = new Menu();
                dock.Children.Add(menu);
                DockPanel.SetDock(menu, Dock.Top);
               
                #region "FILE" menu items
                if (true)
                {
                    MenuItem itemFile = new MenuItem();
                    itemFile.Header = "File";
                    menu.Items.Add(itemFile);

                    MenuItem FileNew = new MenuItem();
                    FileNew.Header = "_New";
                    FileNew.Click += MenuItemClick;
                    itemFile.Items.Add(FileNew);

                    MenuItem FileOpen = new MenuItem();
                    FileOpen.Header = "_Open";
                    FileOpen.Click += MenuItemClick;
                    itemFile.Items.Add(FileOpen);

                    MenuItem FileSave = new MenuItem();
                    FileSave.Header = "_Save";
                    FileSave.Click += MenuItemClick;
                    itemFile.Items.Add(FileSave);

                    MenuItem FileClose = new MenuItem();
                    FileClose.Header = "_Close";
                    FileClose.Click += MenuItemClick;
                    itemFile.Items.Add(FileClose);
                }
                #endregion

                #region "EDIT" menu items
                if (true)
                {
                    MenuItem itemEdit = new MenuItem();
                    itemEdit.Header = "Edit";
                    menu.Items.Add(itemEdit);

                    MenuItem EditConnect = new MenuItem();
                    EditConnect.Header = "_Connect Classes";
                    EditConnect.Click += MenuItemClick;
                    itemEdit.Items.Add(EditConnect);
                }
                #endregion
            }
            #endregion

            #region Bottom Docked: STATUSBAR
            if (true)
            {
                // Create status bar.
                status = new StatusBar();
                StatusBarItem statitem = new StatusBarItem();
                statitem.Content = "Status";
                status.Items.Add(statitem);

                // Dock status bar at bottom of panel.
                DockPanel.SetDock(status, Dock.Bottom);
                dock.Children.Add(status);
            }
            #endregion

            #region Right Docked: PROPERTY PANEL
            if (true)
            {
                StackPanel props = new StackPanel();
                DockPanel.SetDock(props, Dock.Right);
                dock.Children.Add(props);
            }
            #endregion

            //default work area
            dock.Children.Add(canvas);
}
Avatar billede nielle Nybegynder
10. november 2007 - 19:22 #1
Det havde måske nok været relevant at nævne at det er WPF – der er trods alt ikke nå mange som har kigget på den slags endnu. :^)

Jeg ville ikke bruge en StackPanel til det formål. Du jo skal tilpasse hver linje med en tekst+en dropdown i forhold til den linje som står ovenover. Jeg ville i stedet vælge en Grid. Problemet med dette er selvfølgeligt at du skal kende antallet af rækker – det er noget ud skal tælle op ud fra din klasse (antallet af søjler er2).

Da der skal en del logik ind i din Grid/StackPanel ville jeg trække den ud som en separat klasse-definition.

Tekst felter laves bed at indsætte TextBlock instanser i søjle 0. Dropdown bokse laves ved at indsætte ComboBox instanser i søjle 1.

En god begyndelse kunne f.eks. se sådan her ud:

    class MyGrid : Grid
    {
        public MyGrid()
        {
            this.Width = 200;
            this.Background = Brushes.Bisque;

            // 2 colomns

            for (int colNo = 0; colNo < 2; colNo++)
            {
                ColumnDefinition colDef = new ColumnDefinition();
                this.ColumnDefinitions.Add(colDef);
            }

            // 10 rows

            for (int rowNo = 0; rowNo < 10; rowNo++)
            {
                RowDefinition rowDef = new RowDefinition();
                this.RowDefinitions.Add(rowDef);
            }

            // Insert rows

            for (int rowNo = 0; rowNo < 10; rowNo++)
            {
                TextBlock textBlock = new TextBlock();
                textBlock.Text = string.Format("Property no. {0}", rowNo);
                Grid.SetRow(textBlock, rowNo);
                Grid.SetColumn(textBlock, 0);
                this.Children.Add(textBlock);

                ComboBox comboBox = new ComboBox();
                for (int itemNo = 0; itemNo < rowNo + 2; itemNo++)
                {
                    ComboBoxItem comboBoxItem = new ComboBoxItem();
                    comboBoxItem.Content = string.Format("Value nr. {0}", itemNo);
                    comboBox.Items.Add(comboBoxItem);
                }

                comboBox.SelectedIndex = 0;
                Grid.SetRow(comboBox, rowNo);
                Grid.SetColumn(comboBox, 1);
                this.Children.Add(comboBox);
            }
        }
    }
Avatar billede nielle Nybegynder
10. november 2007 - 19:23 #2
... hvilket kræver at du ændre:

            #region Right Docked: PROPERTY PANEL
            if (true)
            {
                StackPanel props = new StackPanel();
                DockPanel.SetDock(props, Dock.Right);
                dock.Children.Add(props);
            }
            #endregion

- til:

            #region Right Docked: PROPERTY PANEL
            if (true)
            {
                Grid props = new MyGrid();
                DockPanel.SetDock(props, Dock.Right);
                dock.Children.Add(props);
            }
            #endregion
Avatar billede montago Praktikant
11. november 2007 - 10:44 #3
i get the point :D
Avatar billede montago Praktikant
11. november 2007 - 11:52 #4
send et svar :)

*man bør sende som svar, når man som du, _svarer_ -- det giver mening
Avatar billede nielle Nybegynder
11. november 2007 - 12:23 #5
> *man bør sende som svar, når man som du, _svarer_ -- det giver mening

Det er jeg så fuldstændigt uenig med dig i. Efter min mening bør man først give et svar når det er klart at spørgeren rent faktisk har fået løst sit problem! Godt nok har jeg postet noget kode, men jeg kunne jo ikke vide om den ville falde i din smag eller om der i øvrigt var behov for noget mere afklaring.

Jeg ved desuden at jeg ikke er den eneste som er af den mening, og f.eks. administratoren har dette at sige http://www.eksperten.dk/enyt.phtml?id=164 - specielt bullet nr. 3 er relevant i denne sammenhæng.

Men siden du jo har bedt om et svar så får du et. :^)
Avatar billede nielle Nybegynder
11. november 2007 - 12:27 #6
I øvrigt, velkomment til WPF - jo mere jeg arbejder med det jo federe synes jeg det er. :^)

Vidste du f.eks. at man kan smide stort set hvad som helst ind som et element i en WPF ComboBox: Tekst som vist ovenfor, eller en anden kontrol (f.eks. en TextBox) eller endda grafik (f.eks. en ellipse) eller en gif. Der er langt flere muligheder end i Windwos.Forms versionen.

I øvrigt foretrækker jeg at arbejde med XAML i denne sammenhæng, omend det selvfølgeligt ikke er helt så velegnet til dynamisk indhols som det ovenfor.
Avatar billede montago Praktikant
11. november 2007 - 13:29 #7
mht. afklaring...

1.
jeg undre mig lidt over at du opretter en colDef, uden at bruge den til at andet, end at smide den ind i columdefinitions.... ?

man skal jo vide hvilken column man bruger / putter noget ind i...

2.
grid'et strækker sig fra top til bund, hvis jeg gerne vil have nogle 'nice' rows som har samme højde, skal jeg da smide endnu en grid ind i griddet ? -- jeg savner <table><tr><td>... markup ;)

---

jow vi er igang med at lære om WPF... men kommer ik helt ind på XAML, selvom det kan nogle smarte ting. Jo det virker ret vildt man kan sætte .content til hvad som helst -- idet alt arver fra UIElement :)
Avatar billede montago Praktikant
11. november 2007 - 13:31 #8
mht svar/kommentar - synes jeg det er forvirrende at finde gamle svar, hvor man er nødt til at læse næsten alle kommentare igennem, før man finder ud af, hvilket der vare svaret --- da synes jeg det er rart at man blot kigger efter den accepterede løsning... omend den måske ikke var det alligevel...

det gør det også¨nemmere for spørgere, blot at lukke spørgsmålet når et passende svar eksistere...

der er jo helvedes mange spørgsmål uden accepteret svar :(
Avatar billede nielle Nybegynder
11. november 2007 - 13:59 #9
Ad 1) Man skal indsætte søjler og rækker i et Grid (colDef og rowDef) - ellers ved kontrollen åbenbart ikke selv hvor mange der skal være og de bliver alle sammen skrevet i en og sammme celle. Den burde selv kunne autodetecte, men det gør den altså ikke. I øvrigt kan man sagtens tilpasse på de enkelte søjler og rækker via deres colDef og rowDef – det er bare ikke gjort i den viste kode.

Du kan se et eksempel på dette her:

http://www.eksperten.dk/spm/802831

Ad 2) Det kan du f.eks. gøre sådan:

            // 10 rows

            for (int rowNo = 0; rowNo < 10; rowNo++)
            {
                RowDefinition rowDef = new RowDefinition();
                rowDef.Height = System.Windows.GridLength.Auto;
                this.RowDefinitions.Add(rowDef);
            }

Ad Sprørgsmål og Svar)

Det er et emne som kommer op med jævne mellemrum. Det korte og det lange er dog at det er en almindelig accepteret praksis at det foregår på den måde her på Eksperten. Der vil givetvis også i fremtiden være folk som ønsker det var anderledes, men sådan er det nu en gang. Muligvis bliver det lavet anderledes i den nye version af Eksperten ... hvornår den så kommer...

> det er forvirrende at finde gamle svar, hvor man er nødt til at læse næsten alle kommentare igennem, før man finder ud af, hvilket der vare svaret --- da synes jeg det er rart at man blot kigger efter den accepterede løsning... omend den måske ikke var det alligevel...

Til gengæld synes jeg netop at det er en fordel at spørgeren beder bestemte personer om at lægge et svar. Så kan man se hvilke af de, til tider, mange indlæg i tråden som har været de brugbare. Alt for tit ser man at folk smider et svar på noget som i den sidste ende slet ikke har bidraget positivt.

> det gør det også¨nemmere for spørgere, blot at lukke spørgsmålet når et passende svar eksistere...

Det er jeg så til gengæld helt ligeglad med. Dem som har lavet et stykke arbejde for at hjælpe en spørger har brugt af deres egen tid. Er der så for meget at spørgeren også skal være lidt aktiv og bede om et svar?

> der er jo helvedes mange spørgsmål uden accepteret svar :(

JA! Men jeg ser det ikke som nogen magisk løsning på dette at folk begynder at smide svar. Det er først og fremmest spørgeren, som har ansvaret for at få lukket et spørgsmål.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester