[英]ScrollBar not visible inside ScrollViewer
我陷入了這個問題一段時間,似乎無法解決。 我創建了一個名為TaskListControl
的UserControl
,它本質上是另一個名為TaskListItemControl
UserControl
的列表,並且我希望它在內容溢出但沒有發生時顯示垂直ScrollBar
。
經過一些搜索和測試后,我試圖分解CustomControl
因為我懷疑問題與項目列表中未定義的空間占用有關。 我將ScrollViewer
包含在Grid
,並將其放置在MainWindow
,但沒有任何變化。
這是列表中包含的TaskListItem的代碼:
<UserControl x:Class="CSB.Tasks.TaskListItemControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CSB.Tasks"
xmlns:core="clr-namespace:CSB.Tasks.Core;assembly=CSB.Tasks.Core"
mc:Ignorable="d"
Height="70"
d:DesignHeight="100" d:DesignWidth="400">
<!-- Custom control that represents a Task. -->
<UserControl.Resources>
<!-- The control style. -->
<Style x:Key="ContentStyle" TargetType="{x:Type ContentControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ContentControl}">
<Border x:Name="ContainerBorder" BorderBrush="{StaticResource LightVoidnessBrush}"
Background="{StaticResource DeepVoidnessBrush}"
BorderThickness="1"
Margin="2">
<!-- The grid that contains the control. -->
<Grid Name="ContainerGrid" Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<!-- Border representing the priority state of the Task:
The color is defined by a ValueConverter according to the PriorityLevel of the Task object. -->
<Border Grid.Column="0"
Width="10"
Background="{Binding Priority, Converter={local:PriorityLevelToRGBConverter}}">
</Border>
<!-- Border containing the Task's informations. -->
<Border Grid.Column="1" Padding="5">
<StackPanel>
<!-- The title of the Task. -->
<TextBlock Text="{Binding Title}" FontSize="{StaticResource TaskListItemTitleFontSize}" Foreground="{StaticResource DirtyWhiteBrush}"/>
<!-- The customer the Taks refers to. -->
<TextBlock Text="{Binding Customer}" Style="{StaticResource TaskListItemControlCustomerTextBlockStyle}"/>
<!-- The description of the Task. -->
<TextBlock Text="{Binding Description}"
TextTrimming="WordEllipsis"
Foreground="{StaticResource DirtyWhiteBrush}"/>
</StackPanel>
</Border>
<!-- Border that contains the controls for the Task management. -->
<Border Grid.Column="2"
Padding="5">
<!-- Selection checkbox of the Task. -->
<CheckBox Grid.Column="2" VerticalAlignment="Center"/>
</Border>
</Grid>
</Border>
<!-- Template triggers. -->
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="True">
<Setter Property="Background" TargetName="ContainerBorder" Value="{StaticResource VoidnessBrush}"/>
<Setter Property="BorderBrush" TargetName="ContainerBorder" Value="{StaticResource PeterriverBrush}"/>
</DataTrigger>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Duration="0:0:0:0" To="{StaticResource LightVoidness}" Storyboard.TargetName="ContainerGrid" Storyboard.TargetProperty="Background.Color"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="MouseLeave">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Duration="0:0:0:0" To="Transparent" Storyboard.TargetName="ContainerGrid" Storyboard.TargetProperty="Background.Color"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<!-- Content of the control: assignment of the DataContext for design-time testing. -->
<ContentControl d:DataContext="{x:Static core:TaskListItemDesignModel.Instance}"
Style="{StaticResource ContentStyle}"/>
這是TaskListControl
代碼:
<UserControl x:Class="CSB.Tasks.TaskListControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CSB.Tasks"
xmlns:core="clr-namespace:CSB.Tasks.Core;assembly=CSB.Tasks.Core"
mc:Ignorable="d"
d:DesignHeight="500" d:DesignWidth="500">
<!-- Custom control that represents a list of TaskListItemControl. -->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ScrollViewer Grid.Row="0"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
DataContext="{x:Static core:TaskListDesignModel.Instance}"
Height="{Binding RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, Path=Height}">
<!-- The items shown in the list. -->
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:TaskListItemControl/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</Grid>
如您所見,我設置了DataContext
以便測試控件,並且實際上可以在設計預覽中看到ScrollBar
:
編輯:我設法顯示ScrollBar
但它似乎溢出包含TaskListControl
的Window
,因為我將它的高度綁定到顯然要考慮標題欄的Window
高度。 這是使用控件的MainWindow
的代碼:
<Window x:Class="CSB.Tasks.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CSB.Tasks"
mc:Ignorable="d"
Title="{StaticResource MainWindow_TitleText}"
Style="{StaticResource WindowDefaultStyle}"
Height="500"
Width="500"
WindowStartupLocation="CenterScreen">
<WindowChrome.WindowChrome>
<WindowChrome ResizeBorderThickness="{Binding ResizeBorderThickness}"
GlassFrameThickness="0"
CornerRadius="{Binding CornerRadius}"/>
</WindowChrome.WindowChrome>
<local:TaskListControl>
<local:TaskListControl/>
</local:TaskListControl>
由於我試圖將TaskListControl
放置在幾乎每種類型的“容器”( Border
, StackPanel
, Grid
等)中,但是沒有運氣,高度仍然溢出,因此TaskListControl
直接放置在Window
。
由於我想直接在UserControl
定義中處理高度,避免每次使用時都這樣做:
TaskListControl
放在MainWindow
什么位置(哪種類型的容器)? UserControl
定義內設置TaskListControl
的高度(現在它已綁定到Window的高度,但根本不正確)? 這是到目前為止我完成的工作的結果(您可以看到底部滾動按鈕丟失了):
有沒有人有什么建議? 預先感謝大家的幫助。
為了調試此類問題,最好的方法是將滾動條可見性設置為Visible,以便您可以看到ScrollViewer的增長情況。 它可能會變得大於屏幕尺寸,並且如果將滾動條可見性設置為“可見”,則底部滾動按鈕將丟失。
也許您已將用戶控件放在一個*高度的容器中,因此它變得比屏幕大,並且滾動條將永遠不會顯示。
更新 :我已經檢查了您的項目,我相信問題是Windows.xaml中的網格。 在第23-27行中,如下更改最后兩個RowDefinition的順序:
<Grid.RowDefinitions>
<RowDefinition Height="{Binding TitleHeight}"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.