Laden...

RowDefinition Height im Verhältnis (3* zu 7*) mit MinHeight

Erstellt von tkrasinger vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.252 Views
T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 12 Jahren
RowDefinition Height im Verhältnis (3* zu 7*) mit MinHeight
<Window x:Class="EnterWindowClassNameHere"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="TestWindow" Height="200" Width="300">
    <Grid>
        <Border>
            <Grid x:Name="grd">
                <Grid.RowDefinitions>
                    <RowDefinition Height="3*" MinHeight="80"/>
                    <RowDefinition Height="7*"/>
                </Grid.RowDefinitions>
                <Border Background="LightGreen">
                    <ScrollViewer VerticalScrollBarVisibility="Auto">
                        <Border Background="Green" BorderBrush="Red" BorderThickness="6" Height="100">
                            <TextBlock VerticalAlignment="Center" FontSize="36">Top</TextBlock>
                        </Border>
                    </ScrollViewer>
                </Border>
                <Border Grid.Row="1" Background="LightBlue">
                    <ScrollViewer VerticalScrollBarVisibility="Auto">
                        <Border Background="Blue" BorderBrush="Black" BorderThickness="6" Height="200">
                            <TextBlock VerticalAlignment="Center" FontSize="36">Bottom</TextBlock>
                        </Border>
                    </ScrollViewer>
                </Border>
            </Grid>
        </Border>
    </Grid>
</Window>

Der unterere Scrollviewer wird nicht mehr ganz angezeigt. Ist das ein Bug oder kann ich das irgendwie anderes gestalten, sodass ich in beiden Bereichen bis zum Ende scrollen kann und oben trotzdem die Mindesthöhe habe?
Wenn man nämlich die MinHeight rausnimmt gehts ...

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo tkrasinger,

nein das ist kein Bug, dein Fenster ist nur zu klein.

200 != 100 + 200

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 12 Jahren

ja, klar ist das Fenster zu klein, deswegen auch ScrollViewer. Zum Vergleich unten mal das Fenster, wenn man die MinHeight wegnimmt. Da weiß der 2. Scrollbalken auch, dass beim Fensterende Schluss ist ...

1.552 Beiträge seit 2010
vor 12 Jahren

Ja das ist das Problem bei MinHeight,

wenn du es ohne hast, dann ist das Fenster 200 hoch, d.h. er teilt sich die TOP und Bottom in 3/10 und 7/10 ein. Dies ist bei 200 (ohne berücksichtigung von Margin) eine Top-Höhe von 60 und eine Bottom-Höhe von 140. Jedoch wenn du MinHeigt auf 80 setzt, ändert sich auch das Verhältnis: d.h. Bottom ist dann nicht mehr 140 sondern 186, und dafür ist das Fenster dann zu klein. Desswegen wird auch der ScrollViewer nicht komplett angezeigt.

Ich hoffe ich habe es etwas verständlich erklärt.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 12 Jahren

ok, verstanden, aber wie lös ich das jetzt?

mögliche Lösung:

private GridLength? original;

public TestWindow()
{
    InitializeComponent();

    ((FrameworkElement)grd.Parent).SizeChanged += new SizeChangedEventHandler(TestWindow_SizeChanged);
}

private void TestWindow_SizeChanged(object sender, SizeChangedEventArgs e)
{
    if (original == null)
    {
        original = row2.Height;
    }

    if (row1.ActualHeight > row1.MinHeight)
    {
        row2.Height = original.Value;
    }
    else
    {
        row2.Height = new GridLength(((FrameworkElement)sender).ActualHeight - row1.ActualHeight);
    }
}

Funktioniert, springt aber irgendwie ... irgendwelche besseren, evtl. direkt im XAML lösbaren Vorschläge? Hab diese Konstellation sicher 20 mal und will das nicht in jeder Maske so einfügen ...

1.552 Beiträge seit 2010
vor 12 Jahren

Das Fenster größer machen, oder dort eine MinHeight setzen. Aber warum gibst du die RowDefinition relativ an wenn die Inhalte der Rows dann doch wieder mit fixen Größen angegeben werden?

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 12 Jahren
  1. Fenster größer: Geht nicht, im realen Programm stellt das Fenster den Bildschirm dar, und der wird nun mal nicht größer ...

  2. eine Minheight am Fenster, was soll das bringen?

  3. Das ist doch nur fürs Beispiel, die beiden Border mit Rahmen stellen "Inhalt" dar. Genausogut, könnte ich das machen:

<Border>
    <Grid x:Name="grd">
        <Grid.RowDefinitions>
            <RowDefinition Height="3*" x:Name="row1" MinHeight="80"/>
            <RowDefinition Height="7*" x:Name="row2"/>
        </Grid.RowDefinitions>
        <Border Background="LightGreen">
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <Border Background="Green" BorderBrush="Red" BorderThickness="6">
                    <StackPanel>
                        <TextBlock FontSize="36">Top1</TextBlock>
                        <TextBlock FontSize="36">Top2</TextBlock>
                        <TextBlock FontSize="36">Top3</TextBlock>
                        <TextBlock FontSize="36">Top4</TextBlock>
                    </StackPanel>
                </Border>
            </ScrollViewer>
        </Border>
        <Border Grid.Row="1" Background="LightBlue">
            <ScrollViewer VerticalScrollBarVisibility="Auto">
                <Border Background="Blue" BorderBrush="Black" BorderThickness="6">
                    <StackPanel>
                        <TextBlock FontSize="36">Bottom1</TextBlock>
                        <TextBlock FontSize="36">Bottom2</TextBlock>
                        <TextBlock FontSize="36">Bottom3</TextBlock>
                        <TextBlock FontSize="36">Bottom4</TextBlock>
                        <TextBlock FontSize="36">Bottom5</TextBlock>
                        <TextBlock FontSize="36">Bottom6</TextBlock>
                        <TextBlock FontSize="36">Bottom7</TextBlock>
                        <TextBlock FontSize="36">Bottom8</TextBlock>
                        <TextBlock FontSize="36">Bottom9</TextBlock>
                        <TextBlock FontSize="36">Bottom10</TextBlock>
                    </StackPanel>
                </Border>
            </ScrollViewer>
        </Border>
    </Grid>
</Border>
1.552 Beiträge seit 2010
vor 12 Jahren

im realen Programm stellt das Fenster den Bildschirm dar

Dann sollte es auch funktionieren, denn dann ist der Bildschirm größer und die Eigenart mit den MinHeight im ersten RowDefinition tritt nicht auf. Es sei denn der User verkleinert das Fenster dass die erste RowDefinition kleiner als 80 würde.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 12 Jahren

das ist für mich keine Lösung. Du gehst zusehr von Beispiel aus. Im realen Programm sind die verhältnisse etwas anders, das minheight ist dann 150 etc.

Die Aufgabenstellung lautet also:
Wie kann ich in einem festen Rahmen, 2 weitere Rahmen im Verhältnis 3:7 anzeigen, wobei der kleinere nicht kleiner werden darf als x. Wenn die Inhalt der beiden Rahmen sich nicht ausgehen, müssen Scrollbalken angezeigt werden.

Im Moment find ich dazu keine Lösung, außer das Verhältnis manuell zu rechnen.

1.552 Beiträge seit 2010
vor 12 Jahren

Mir fällt z.Z. auch nichts ein, da dir duch MinHeight bezüglich Verhältnis die Hände gebunden sind.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 12 Jahren

habs noch etwas genau ausgedrückt. Ich hätte gern 3:7 und wenn die 3* < 80 sind, dann 80:*