Steuerelemente mit dem Fenster skalieren

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Steuerelemente mit dem Fenster skalieren

    erstmal sry für die nekromantie, dachte mir, da es eben dazu passt wäre es besser dort zu posten anstatt einen neuen Thread zu eröffnen (zumindest bin ich das aus anderne Foren so gewohnt), nun dann ebend nochmal in nem neuen thread^^

    ich möchte, beim vergrößern eines Fensters die Steuerelemente
    ebenso vergrößern und verkleinern, eben so wie man das Fenster vergößert
    oder verkleinert. Ich arbeite dabei mit WPF.

    dazu dachte ich mir, ich nehme den neuen wert des Fensters, dividiere
    diesen durch den originalen Wert und mithilfe des Faktors vergrößere /
    verkleinere ich die Steuerelemente, eventuell auch abschnittsweise
    verschieden stark. (länge und breite wird einzeln berechnet)

    ich habe nun ein problem, dass mir das Fenster, obwohl ich es durch das
    _Loaded Event des Fensters auf einen anfangswert setzen lasse, mir auf
    1940 px in die breite springt (823 px is der standart wert) sobald ich
    es im debug modus starte. ich vermute, dass dieses problem mit dem
    _SizeChanged Event des Fensters zusammenhängt, in dem ich die berechnung
    durchführen lasse. Diese Methode wird nach dem Loaded event warum auch
    immer (nicht von mir) 5 mal aufgerufen, doch überschreibe ich dabei
    weder die Me.Height noch die Me.Width mit dem von mir geschriebenen
    Quellcode.

    hier mal ein wenig Code:

    VB.NET-Quellcode

    1. Private Sub MainWindow_SizeChanged(ByVal sender As Object, ByVal e As System.Windows.SizeChangedEventArgs) Handles Me.SizeChanged
    2. hoehe_neu = Me.Height
    3. breite_neu = Me.Width
    4. hoehe_neu = hoehe_neu / hoehe
    5. breite_neu = breite_neu / breite
    6. DataGrid1.Height = DataGrid1.Height * hoehe_neu
    7. DataGrid1.Width = DataGrid1.Width * breite_neu
    8. End Sub

    hmm jetzt beim schreiben fällt mir auf, dass ich wohl nicht nur einen
    fehler, sondern zwei in meiner denkweise hab. was das Datagrid angeht,
    soll dieses von der linken seite des Fensters bis zur rechten seite
    reichen, was es auch, egal wie man am fenster herumzieht macht... doch
    eigentlich müsste es doch sich von einem Rand des Fensters weiter
    entfernen, da das Fenster(dessen breite) sich um einen höheren Betrag
    vermehrt als es das DataGrid es nach der berechnung tun sollte (fenster
    eig. 823 pixel standart, DataGrid 800, um den rand auszugleichen)

    achja, bevor ichs vergess, im _loaded Event steht noch ein "Me.Width = 823"
    und wer sich fragt wo die Variablendeklarationen sind, die wurden
    (bisher noch) global deklariert (wenn es denn so genannt wird) und
    allesamt als double. des weiteren entsteht das Fenster auf der
    gewünschtwen Größe, sobald ich die Berechnung herausnehme/auskommentiere
    und dann Starte.

    so um es nochmal zusammen zu fassen:
    Warum öffnet sich meine Fenster auf 1940px breite?
    warum verhält sich das DG anderst als erwartet? (perfekte skalierung ungeachtet meines Faktors, was eigentlich erfreulich ist)
    warum lässt es sich nicht in der höhe skalieren?
    und zu guter letzt, gibt es bessere, einfachere methoden um das zu bewerkstelligen?
    MfG
    Wie kinsi schon gesagt hat ich bin ebenfalls der meinung das es mit anchor funktionieren könnte.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Ein Anchor ist ebend nicht die lösung, ich hab (soweit ich es zumindest beurteilen kann) sämtliche properties, die damit zusammenhängen könnten, ausprobiert, ich werde es nochmal testen, zur sicherheit, doch sehe ich dem pessimistisch entgegen. zudem bin ich mir nicht ganz sicher ob mir diese properties so zur verfügung stehen...ich meine ich hätte weder dock noch anchor, zumindest was das datagrid angeht, gesehen, weswegen ich auch ziemlich direkt zu einer eigenen lösung übergegangen bin.

    ansonsten, gäbe es zu meiner "möglichkeit" die steuerelemnte zu skalieren, welche so wie es bisher aussieht fehlerhaft ist, vielleicht eine bessere? einfacherere?
    Anchor oder Dock ist die Lösung für WinForm.

    Bei WPF musst Du die horizontale und vertikale Ausrichtung auf Stretch setzen und den Abstand zum Rand (Margin) angeben.
    Beispiel:

    VB.NET-Quellcode

    1. <DataGrid Name="DataGrid1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="10" />

    Alternative Angabe von Margin (Links, Oben, Rechts, Unten)

    VB.NET-Quellcode

    1. <DataGrid Name="DataGrid1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="10, 20, 50, 100" />

    Oder Änderung zur Laufzeit

    VB.NET-Quellcode

    1. Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    2. With Me.DataGrid1
    3. .Margin = New Windows.Thickness(10, 20, 50, 100)
    4. .HorizontalAlignment = Windows.HorizontalAlignment.Stretch
    5. .VerticalAlignment = Windows.VerticalAlignment.Stretch
    6. End With
    7. End Sub
    pls sowas nicht im CodeBehind machen!

    @TE: google mal nach layout in wpf.
    Wpf kennt verschiedene LayoutContainer, v.a. Grid, StackPanel, DockPanel, mit denen man alle üblichen Anforderungen abdecken kann. Aber man muß sich einarbeiten.

    edit: wpftutorial.net/LearnWPFin14Days.html enthält glaub auch ein klein Kapitel zu Layout
    Vielen Dank erstmal für die Hilfe und entschuldigung, dass ich erst jetzt antworte, hatte einiges zu tun^^

    so, ich hab mir mal das Tutorial angesehen, und ein wenig mit den containern herumprobiert, die werte abwechselnd auf stetch gesetzt etc.
    ich habe nun das problem, dass ich entweder ein Grid habe (in einem dock panel) welches bei seiner größe von z.B 800px bleibt wenn man das Fenster vergrößert, oder, und das is die bisher bessere Variante, öffnet sich das Fenster mit der von mir angegebenen Maximalbreite, mit einem gestretchten Grid. das Fenster soll aber zu anfangs nur 800 px breit sein.

    btw. CodeBehind?
    CodeBehind ist mir so kein Begriff, vllt weis ich schon was dahinter steckt, hab aber dieses Wort im speziellen noch nicht gehört. Ich bin zwar nicht gerade neu in der Programmierung aber dennoch ein Anfänger und Umsteiger (vorher Java)

    Edit: Jaja kleine fehler bestraft das leben... testweise das Grid auf 800 px breite gsetzt (codeseitig) und vergessen den eintzrag wieder zu entfernen... ich glaube eine steinigung wäre nur entsprechend...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    ich setzte dieses Thema mal auf erledigt, da sich meine probleme mit dem DG inzwischen geklärt haben, naja fast, aber das ist nicht weiter schlimm.
    immerhin konnte ich was neues lernen und erfahren, dass mein gehirn ab 32°C (momentan 35° im Raum) zu stottern beginnt xD

    Lösung war die Artbeit mit den Propertys MaxWidth, Width,MinWidth, MaxHeight, Height, MinHeight, sowie auch HorizontalAlignment und den jeweiligen Margins.
    je nach Property wurden ebend fixe Werte(max...,min..., margins), Auto oder stretch(horizontal...) zugeteilt.
    Mein letztes Problem wird sich auch noch lösen, zumal ich dieses Problem bei einem blanken Testobjekt mit lediglich einem DG garnicht hab.
    nochama:

    ErfinderDesRades schrieb:

    @TE: google mal nach layout in wpf.
    Wpf kennt verschiedene LayoutContainer, v.a. Grid, StackPanel, DockPanel, mit denen man alle üblichen Anforderungen abdecken kann. Aber man muß sich einarbeiten.

    edit: wpftutorial.net/LearnWPFin14Days.html enthält glaub auch ein klein Kapitel zu Layout

    allein mit Margins, Widths und Heights kannste nix verzapfen, was man als "Layout" bezeichnen können dürfte ;)
    Mir ist klar, dass man damit kein layout erstellt, es hat mir lediglich bei meinem problem mit der DG geholfen. dass ich für die anderen steuerelemente/für ein layout natürlich auch andere container,etc. brauche steht ausser frage^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()