<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 ...
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 ...
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.
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 ...
Fenster größer: Geht nicht, im realen Programm stellt das Fenster den Bildschirm dar, und der wird nun mal nicht größer ...
eine Minheight am Fenster, was soll das bringen?
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>
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.
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.
habs noch etwas genau ausgedrückt. Ich hätte gern 3:7 und wenn die 3* < 80 sind, dann 80:*