Laden...

Width und Height von dynamischem Control abfragen

Erstellt von oehrle vor 12 Jahren Letzter Beitrag vor 12 Jahren 5.351 Views
O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren
Width und Height von dynamischem Control abfragen

Hallo, ich habe eine Oberfläche mit verschiedenen Panel erstellt. je nach Änderung der Größe des Fensters wachsen die Panels mit oder schrumpfen. Wenn ich die Oberfläche starte und in ein Panel zeichnen möchte, will ich sofort genau in der Mitte mit dem Zeichnen beginnen. Wenn ich aber das Control sofort nach dem Initialisieren im Konstruktor abrufe, bekomme ich immer nur "NAN". Es muss doc hmöglich sein an die Angaben ran zu kommen. Wie muss ich da vorgehen?

U
1.578 Beiträge seit 2009
vor 12 Jahren

Die Größe wird erstn nach dem Measurement bekannt.
Das Layout durchläuft in WPF mehrere Stadien

  • Measurement (Größe berechnen)
  • Arrange (Positionieren)
  • Render (Darstellen)

Je nachdem wo du steckst ist eventuell noch nicht alles fertig.

Unabhängig davon solltest du "ActualWidth" nehmen statt "Width" - die "Width" ist nur gesetzt wenn du es explizit an gibst.

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren
Grösse mit ActualWidth

Hallo, danke erst mal aber das funktioniert nicht. Ich habe das Window nun mal öffnen lassen, ein paar mal Ereignisse von Buttons abgearbeitet und dann ein mal einen BreakPoint gesetzt un die .ActualWidth oder nur die Width abzurufen. Ohne Erfolg, .ActualWidth ist 0.0

Im XAML-COde habe ich das Panel mit Height = "Auto" gestellt. Mache ich dort feste WErte rein ist das Panel nicht mehr dynamisch.

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren
.Arrange() Maße abfragen?

Hallo, wenn sich das Window im Konstruktor befidnet und die Initialiaze() abgearbeitet ist, dann kann ich mit cnv_Panel.Arrange() das Rect abfragen. Da sind die Werte aber auch überall 0.0
Muß ich die Werte an einer bestimmten Stelle oder Ereignis abgreifen?

U
1.578 Beiträge seit 2009
vor 12 Jahren

Arrange solltest du nicht selber aufrufen, das ist aufgabe des Parent Controls.

Wenn ActualWidth 0.0 ist, dann ist das Control auch tatsächlich 0.0 Breit.

Im XAML-COde habe ich das Panel mit Height = "Auto" gestellt
  1. Height != Width 😉
  2. "Auto" bedeutet das die Spalte oder Reihe so Breit oder Hoch ist wie die Controls darin sein möchten.

Wenn dein cnv_Panel keine Child Controls beinhaltet die eine größe haben, dann ist das Control selber natürlich auch 0 breit oder hoch.

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren
Groesse abfragen

Das heißt also, um die daten von cnv_ZEichnen zu bekommen muß ich die Daten von Parent abfragen? Das Ding steckt in einem StackPanel.

U
1.578 Beiträge seit 2009
vor 12 Jahren

Neeee.
Du hast die Spalte auf Width="Auto", dh das Grid fragt an der stelle alle childs in dieser Spalte wie breit sie gerne wären.
Und jedes Grid fragt dann seine Childs - so klettert er runter und baut die oberfläche auf.

Was nun passieren kann - wenn es kein Inhalt gibt, dann ist alles 0 da es kein Platz möchte.

Z.B.:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    <Grid.ColumnDefinitions>

    <StackPanel x:Name="stackPanel">
        <Grid x:Name="grid" />
    <StackPanel>

</Grid>

"stackPanel" sowie "grid" ist nun ActualWidth = 0.0. Da sie nichts an zu zeigen haben, brauchen sie auch kein Platz.

Hast du dagegen so etwas:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    <Grid.ColumnDefinitions>

    <StackPanel x:Name="stackPanel">
        <Grid x:Name="grid">
            <TextBlock Text="Demo" />
        </Grid>
    <StackPanel>

</Grid>

Dann ist nun "stackPanel" und "grid" ActualWidth = Breite die "Demo" erfodert um sich an zu zeigen.

Wenn du die Grid Spalte seine breite berechnen lässt, sieht es wieder anders aus:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="150" />
        <ColumnDefinition />
    <Grid.ColumnDefinitions>

    <StackPanel x:Name="stackPanel">
        <Grid x:Name="grid" />
    <StackPanel>

</Grid>

Nun ist "stackPanel" und "grid" ActualWidth = 150. Da das Grid die Breite vor gibt, dann Stretchen sich die Element.

Und bei

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width=".5*" />
        <ColumnDefinition Width=".5*" />
    <Grid.ColumnDefinitions>

    <StackPanel x:Name="stackPanel">
        <Grid x:Name="grid" />
    <StackPanel>

</Grid>

ist "stackPanel" und "grid" ActualWidth = <aktuelle Grid breite> / 2.

Darum fragte ich wie dein Xaml aussieht, wenn dein ActualWidth = 0.0 ist, dann hat er vermutlich nichts an zu zeigen und die Spalte die auf "Auto" steht verkleinert alles auf 0.0.

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren
Wie kann man eine komplette Spalte verstecken?

Hallo, wenn ich ein Grid habe, mit mehreren Rows und Spalten, wie kann ich in der Code-Behind die Ganze Spalte mit ihren Rows oder nur eine Row in einer Spalte unsichtbar machen?
Bei StackPanel gibts das Visibility.

U
1.578 Beiträge seit 2009
vor 12 Jahren

Hast du meine Antworten gelesen? Eine Row und Column ist nie unsichtbar, sie ist immer da, nur wenn du keine größe vorgibst und nichts in dem Bereich hast, dann ist die größe eben 0 und du siehst nichts.

Ich klink mich aus, wird mir grad zu blöd hier die WPF Basics vor zu kauen...

O
oehrle Themenstarter:in
461 Beiträge seit 2009
vor 12 Jahren

Hallo David, sorry, aber WPF ist erst mal nicht so einfach. Ich wollte wissen, ob ich komplette Spalten mit ihren definierten Rows ausblenden (oder besser gesagt mit anderen Controls überlagern) kann, somit hätte ich mit ein Abfrage-Dialog mit einem Fenster bauen können. Im oberen halben Grid hätte ich gezeichnet, im unteren drittel wären die Abfragen gelaufen für Winkel, Radien, Geraden usw. Habe das aber gelassen und mit drei kleine modale Fenster für die Abfrage erstellt. Das mit der Grössenabfrage passt nun auch. Das eingebettete Grid
im Grid schrumpft und wächst korrekt mit Vergroessern und verkleinern des Window. Das Problem lag wohl mit dabei, bei der Transformation. Die Groessenabfrage und zuordnungen hole ich mir nun erst wenn das Window "Loaded" ist.
Allerdings habe ich nun eine andere Schwierigkeit. Ich zeichne ein Fadenkreuz in das Grid. Wenn ich das Window verkleinere, bleibt das Fadenkreuz nicht vertikal zentriert. Ich habe mal eine Linie von links oben nach rechts unten gezeichnet. verkleiner ich das Window, bleibt es zwar links oben in der Ecke korrekt, aber unten rechts bleibt die Linie nicht in der Ecke, sondern wandert nach links aus der Ecke heraus. Ich habe vesucht in "Size_Changed"-Event das abzufangen, und zu verschieben. Eigentlich müßte ich doch nur den Nullpunkt von X und Y neu berechnen und übergeben, oder?