Jest kilka pytań dotyczących ScrollViewer, które zbadałem, ale żaden z nich nie zadziałał u mnie. To prawie na pewno sprowadza się do mojego braku zrozumienia co do wielkości elementu. Po pierwsze, mój XAML (inna niż definicja UserControl, to cała kontrola):Osadzanie elementu ItemsControl w ScrollViewer
<DockPanel Width="Auto">
<ScrollViewer DockPanel.Dock="Top" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" CanContentScroll="True" BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1,1,1,1" Background="{DynamicResource LightGradientBackgroundBrush}">
<ItemsControl Focusable="false" Width="Auto" MinHeight="30" ItemsSource="{Binding RequiredFields}" OverridesDefaultStyle="False">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<DockPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="3,0,3,3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="110"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Content="{Binding Path=Header, Mode=OneTime}" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="0"/>
<TextBox Text="{Binding Path=Value}" HorizontalAlignment="Stretch" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="1"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</DockPanel>
Ta kontrola jest ładowany w karcie jako treść. Okno, w którym znajduje się zakładka, jest skalowalne, a minimalny rozmiar zawartości karty to 60. Próbuję zrobić to, aby przewijany ekran wypełniał kartę, ale nie przesuwał karty poza obszar okna. W przypadku powyższego XAML nadmiar treści powoduje zwiększenie wysokości tabulatora, a pasek przewijania pojawia się w oknie, a nie w Tab.
Przeglądarka przewijania rozszerza się do rozmiarów jej elementów podrzędnych, co powoduje przesuwanie jej wysokości. To, czego chcę, to przewijarka, która ma być ustawiona na rozmiar karty, i zawartość w przewijaniu rośnie w granicach przewijania, tak, że pasek przewijania jest wyświetlany, gdy jest za dużo treści.
Gdzie się mylę?
Edit:
Problemem jest wysokość, a nie szerokości. Szerokość zachowuje się tak, jak powinna. Zmieniłem opakowanie do siatki zgodnie z sugestią, ale jeśli nie ustawię właściwości Wysokość, siatka rozszerzy się, aby dopasować zawartość rozszerzonego przewijania, powodując taki sam problem jak poprzednio.
Updated XAML:
<Grid MinHeight="60" VerticalAlignment="Top">
<Border BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1,1,1,1">
<ScrollViewer
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Visible"
CanContentScroll="True"
BorderBrush="{DynamicResource PanelBorder}"
BorderThickness="1,1,1,1"
Background="{DynamicResource LightGradientBackgroundBrush}"
>
<ItemsControl Focusable="false" Width="Auto" MinHeight="30" ItemsSource="{Binding RequiredFields}" OverridesDefaultStyle="False">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="3,0,3,3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="110"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Content="{Binding Path=Header, Mode=OneTime}" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="0"/>
<TextBox Text="{Binding Path=Value}" HorizontalAlignment="Stretch" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="1"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="DockPanel.Dock" Value="Top"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</ScrollViewer>
</Border>
</Grid>
Żadne z poniższych odpowiedzi przyczyniły się do tej pracy, ale jestem dość przekonany, że odpowiedzi będzie działać w większości przypadków.
Moja kontrola jest obsługiwana na stronie zakładki. Jest on ładowany dynamicznie i nie mam kontroli nad tym, jak zaprojektowana jest strona karty. Mam przeczucie, że kontrolka tabulacji pozwala na tyle przestrzeni, ile zawiera w niej treść. Ponieważ siatka kontrolna mówi, że zużywa całą dostępną przestrzeń, a strona z kartami oferuje tyle miejsca, ile potrzebuje kontener z dzieckiem, a itemcontrol próbuje wykorzystać tyle miejsca, ile oferuje siatka; kończy się ona rozwijaniem strony z zakładkami, która zawiera całą zawartość ItemsControl.
Jeśli strona karty została utworzona w taki sposób, aby nie była rozwijana w celu dopasowania jej zawartości, poniższe rozwiązania zadziałałyby. Niestety, nie sądzę, żeby tak było.
Jeden cały dzień zmarnowany na to. Czas by iść naprzód.
Dzięki @Mike. Jeśli używam kontrolki siatki jako opakowania i ustawię stałą wysokość, działa ona tak jak w reklamie. Jednakże, jeśli okno jest rozwinięte, jest dużo pustej przestrzeni u góry/u dołu. Chcę, aby siatka rozszerzyła się wraz z rodzica, ale ograniczają jej dzieci (pionowo). Więc wolałbym nie ustawiać stałej wysokości. Jeśli tego nie zrobię, pojawi się to samo nieprawidłowe zachowanie. –
Przepraszam, chciałem powiedzieć, aby utworzyć definicję kolumny i wiersza i ustawić odpowiednio szerokość i wysokość *. To powinno osiągnąć to, czego chcesz. –
To też nie działa dla mnie, ale myślę, że zrozumiałem dlaczego. Będę edytować moje pytanie z tym, co myślę, więc to pytanie nie jest całkowitą stratą czasu. Dzięki za pomoc. –