Dynamische Positionierung von Controls

  • WPF

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Yothrii.

    Dynamische Positionierung von Controls

    Hallo,

    ich bin ziemlicher WPF Neuling und baue in meine Applikation gerade die Multilanguage ein.
    Das ändern der Sprache via ComboBox funktioniert auch schon prima nur gibts da ein Problem.
    Und zwar hab ich z.B. ein Label vor der ComboBox welches den Content={DynamicResource label_Language} hat. D.h. die Größe des Labels kann sich beliebig anpassen jenachdem was für eine Sprache gewählt ist.
    Nun hab ich direkt neben dem Label halt die ComboBox um die Sprache auszuwählen und wenn ich jetzt ne andere nehme ist das Label halt kleiner oder größer als vorher weil sich der Text ändert.
    Wenn das Label dann von der Breite länger wird überschneidet sich ComboBox und Label was natürlich unschön ist. Und da kommen wir zu meiner Frage, kann man die ComboBox irgendwie dynamisch positionieren, sodass sie sich immer genau am Label anpasst?
    Habe auch schon mein Glück im Internet versucht und danach versucht zu suchen, ich weiß allerdings nicht welche Keywords ich benutzen soll und kam daher auch nicht weit.

    Danke im Voraus
    Hey @Yothrii
    Ich bin nicht 100% sicher, ob dir dieser Einwand helfen wird, aber gibt es die Möglichkeit das du mit Graphics.MeasureString dir die Werte nehmen könntest und dem enstprechend evtl die Controls positionierst. ?(
    Da dein Label ja einen Text (String) hat bzw. bekommt sollte das gehen.. denke ich mal.. zumindest mit dem Wert kannst du die Location berechnen.
    Bin auch erst seit 2 Tagen an WPF.. Sollte aber auch dort die Möglichkeit geben Graphics.MeasureString nutzen zu können, wenn ich WPF bisher richtig verstanden habe.

    msdn.microsoft.com/de-de/library/6xe5hazb(v=VS.110).aspx

    (nur ein Einwand, weil bisher noch nix kam)
    Option Strict On!

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

    @Yothrii
    Versuche es in etwa so:

    XML-Quellcode

    1. <Canvas Height="25">
    2. <Grid Height="25" Width="{Binding Path=ActualWidth, ElementName=MyLabel}">
    3. <Grid.ColumnDefinitions>
    4. <ColumnDefinition />
    5. <ColumnDefinition Width="95"/>
    6. </Grid.ColumnDefinitions>
    7. <Label Name="myLabel" Grid.Column="0">verändere hier den Text</Label>
    8. <TextBox Grid.Column="1">Hallo</TextBox>
    9. </Grid>
    10. </Canvas>

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

    Drahuverar schrieb:

    Sollte aber auch dort die Möglichkeit geben Graphics.MeasureString nutzen zu können, wenn ich WPF bisher richtig verstanden habe.

    Leider nicht, ist m.M.n auch der völlig Falsche Weg sowas zu bewerkstelligen. Das muss anders funktionieren. Mit Graphics wird sowieso nicht gearbeitet. Graphics-Klasse ist GDI und WPF arbeitet nicht mehr mit dem veralteten GDI sondern mit DirectX.
    Trotzdem danke für die Antwort :)

    @VB1963 Danke, ich probiere das mal aus.

    Yothrii schrieb:

    Und da kommen wir zu meiner Frage, kann man die ComboBox irgendwie dynamisch positionieren, sodass sie sich immer genau am Label anpasst?


    Benutz' ein Grid, pack das Label und die Box in verschiedene Columns, und gib der Column mit dem Label die Breite Auto, dann passt die sich der Breite des Labels an.
    | Keine Fragen per PN oder Skype.

    SeriTools schrieb:

    Yothrii schrieb:

    Und da kommen wir zu meiner Frage, kann man die ComboBox irgendwie dynamisch positionieren, sodass sie sich immer genau am Label anpasst?


    Benutz' ein Grid, pack das Label und die Box in verschiedene Columns, und gib der Column mit dem Label die Breite Auto, dann passt die sich der Breite des Labels an.

    Hört sich auf jedenfall sehr logisch an. Bin auch ziemlicher WPF Neuling aber das krieg ich bestimmt hin. Probiere das gleich aus.

    @ErfinderDesRades Weißt du, ich frage mich halt ob das auch so der Sinn der Sache ist, ich will ja eig. nur wissen ob es geht und wenn ja wie es von Microsoft vorgesehen wird.
    Sich etwas falsch anzueignen ist m.M.n nicht sehr elegant deswegen bin ich darauf aus von Anfang direkt das meiste richtig zu lernen.

    Ich mach mich jetzt erstmal ran.
    Danke
    naja - wie's aussieht, hast du inzwischen 3 verschiedene Vorschläge - alle von MS vorgesehen.
    Probier die alle durch, es ist sehr wichtig, sich ins Wpf-Layout-System einzuarbeiten.

    Yothrii schrieb:

    Sich etwas falsch anzueignen ist m.M.n nicht sehr elegant deswegen bin ich darauf aus von Anfang direkt das meiste richtig zu lernen.
    Den Zusammenhang verstehe ich nicht - hat jemand versucht, dir etwas falsches beizubringen?

    Aber meinem Vorschlag, du könntest den einen oder anderen deiner Versuche hier mal posten, das kannst du als sehr zuverlässige Vorbeuge-Massnahme auffassen, um zu verhindern, sich etwas falsch anzueignen.
    Weil dann gucken da paar mehr drauf als nur du selber.

    ErfinderDesRades schrieb:

    Den Zusammenhang verstehe ich nicht - hat jemand versucht, dir etwas falsches beizubringen?

    Ach Mist, so meinte ich das garnicht, ich meinte eher sowas wie, dass ich mir selbst Lösungen verschaffe ob es so nun vorgesehen ist oder nicht. Das wollte ich eig. vermeiden und das meinte ich auch mit meinem Beitrag. Das war jetzt nicht auf irgendjemanden bezogen ^^

    Folgendes hab ich mir jetzt zusammengebastelt, allerdings hab ich über dem ganzen jetzt noch eine CheckBox die Breiter ist als das Label jemals sein wird und diese Checkbox zieht dann, obwohl die CheckBox und das Label in verschiedenen Rows/Columns sind trotzdem die Label-Column in die Breite. Ich bräuchte sowas wie eine Zellen-Verbinden Funktion wie in Word.

    XML-Quellcode

    1. <Grid>
    2. <Grid.ColumnDefinitions>
    3. <ColumnDefinition Width="auto" />
    4. <ColumnDefinition Width="auto"/>
    5. </Grid.ColumnDefinitions>
    6. <Grid.RowDefinitions>
    7. <RowDefinition Height="auto" />
    8. <RowDefinition Height="auto" />
    9. </Grid.RowDefinitions>
    10. <CheckBox Grid.Column="0" Grid.Row="0" Name="checkBox_WindowsAutoStart" Content="Start with Windows?" Checked="checkBox_WindowsAutoStart_CheckedChanged" Unchecked="checkBox_WindowsAutoStart_CheckedChanged" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10,0,0"/>
    11. <ComboBox Grid.Column="1" Grid.Row="1" SelectionChanged="comboboxLanguage_SelectionChanged" Name="comboBox_language" VerticalAlignment="Top" Width="auto" Margin="10,10,0,0">
    12. <ComboBoxItem Tag="de-DE" Content="German (Germany)" />
    13. <ComboBoxItem Tag="en-US" Content="English (United States)" />
    14. </ComboBox>
    15. <Label Grid.Column="0" Grid.Row="1" Content="Sprache: " Width="auto" VerticalAlignment="Top" Margin="10,10,0,0"/>
    16. </Grid>


    Das ganze sieht so aus:

    Seht ihr, die Breite der Label Column passt sich der Breite von der CheckBox Column an.

    Edit: Ich glaub ich habs, das nennt sich wie bei HTML Tabellen ColumnSpan/RowSpan.
    Siehe:
    Kann ich das denn so dann auch lassen oder gibts noch Verbesserungsvorschläge?

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

    Yothrii schrieb:

    Seht ihr, die Breite der Label Column passt sich der Breite von der CheckBox Column an.
    Vlt. schafft ja Checkbox.Grid.ColumnSpan="2" Abhilfe, das ist eine Art "Zellen verbinden" - Einstellung.

    Aber probier auch das mit Label.HorizontalAlignment=Right (ohne Checkbox.ColumnSpan) - das löst das Prob glaub auch, allerdings auf andere Weise.

    ErfinderDesRades schrieb:

    Yothrii schrieb:

    Seht ihr, die Breite der Label Column passt sich der Breite von der CheckBox Column an.
    Vlt. schafft ja Checkbox.Grid.ColumnSpan="2" Abhilfe, das ist eine Art "Zellen verbinden" - Einstellung.

    Jop, genau das war´s, siehe mein letzter Post der Edit. Hatte es schon selbst rausgefunden.

    Yothrii schrieb:

    Kann ich das denn so dann auch lassen oder gibts noch Verbesserungsvorschläge?


    Aber jedenfalls schonmal vielen vielen Dank, es funktioniert jetzt so wie ich es haben wollte.

    Yothrii schrieb:

    Kann ich das denn so dann auch lassen ... ?
    Um ehrlich zu sein: Nein, überhaupt nicht.
    Also Layout hast du nu schoma einen ersten Einblick, aber deine Datenhaltung ist ein Wpf-Gräuel.
    Versuch dir mal was zum MVVM-Pattern anzulesen, vorzugsweise was von Josh Smith.
    Und guck im Wpf-Tutorial-Bereich des Forums herum, die meisten dortigen Samples sind in dieser Hinsicht ordentlich gebaut.
    Ein Checkbox_Clicked - Event im CodeBehind, oder ComboboxItems hardCoded im Xaml - sowas kann man eiglich nicht bringen.
    Vollzitat entfernt. ~Trade
    Ja da hast du Recht, dessen bin ich mir allerdings schon bewusst. Das ist aktuell auch nur eine Notlösung denn in der Schule lernen wir bald das MVVM kennen und wollte das dann als Projekt-übung direkt auf mein privates Projekt anwenden.

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