ScrollView 的 Child 无法通过 Window Resize WinRT 正确调整大小
ScrollView's Child Not Resizing Properly With Window Resize WinRT
场景:
我正在 WinRT/Win8.
开发商店应用程序
我有一个 ScrollView
,里面有一个自定义的 UserControl
child - 都是一个 "main" UserControl
.
当主要 UserControl
(与 ScrollView
-> child UserControl
)在 Initialized/navigated 时 - 即使应用宽度 不是full-screen; UserControl
处于 ScrollView
的全宽 - 根据需要。下图:
- Image 1 - main User Control Opens with Window Fullscreen
- Image 2 - main User Control Opens Starts Half-Width (or any width)
ScrollView
本身位于 Grid
内,并与应用程序 window 的整个宽度保持一致,即使根据需要调整大小也是如此。
问题:
我遇到的问题是,当我水平调整 App window 大小时,child UserControl
的宽度与其 parent ScrollView
的宽度不同s.
这会导致 ScrollView
出现水平滚动条——这是我不想要的。
我想将 child 的宽度限制在 ScrollView
的宽度内,没有水平滚动条(如 Image 2)。
Markup 与此类似(为了便于阅读,我已将其精简):
<Grid>
<!-- Some row/column definitions in here -->
...
<!-- A header TextBlock -->
...
<ScrollViewer x:Name="scrlTableRows" Grid.ColumnSpan="3" Grid.Row="1"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
Padding="66,0,66,40" ZoomMode="Disabled">
<local:MyCustomUserControl Margin="0,10,0,10" HorizontalAlignment="Stretch" />
</ScrollViewer>
...
<!-- Just a button here-->
</Grid>
我已经尝试过设置(在child自定义UserControl
):
Width="{Binding Path=ActualWidth, ElementName=scrlTableRows}"
child 不是 设置为 ScrollView
的全宽开始(这是我需要的),并且不会调整宽度parent 或者 - 给我滚动条
Width="{Binding Path=Width, ElementName=scrlTableRows}"
child 从 parent 的全宽开始,但不调整大小- 给我滚动条
我也试过将 UserControl
放在 Grid
内(在 ScrollView
内),还有许多其他 HorizontalAligment
和 Width
属性。
一切都无济于事。
Whosebug 的其他有帮助的同事没有其他类似的 situations/answers 工作。
显然,我需要垂直滚动条——这是显而易见的;在任何人问之前。
请问有人能给我指点吗?
更新:
这是自定义 UserControl
的 Xaml,应 @LovetoCode 的要求:
<UserControl *usual user control declaritive stuff in here*>
<UserControl.Resources>
<CollectionViewSource x:Key="FieldViewModelsSource" Source="{Binding ItemToEdit.FieldViewModels}"/>
<datatemplateselectors:FieldViewModelDataTemplateSelector
x:Key="FieldViewModelDataTemplateSelector"
AudioFieldTemplate="{StaticResource TableRowAudioFieldDataTemplate}"
CheckboxFieldTemplate="{StaticResource TableRowCheckboxFieldDataTemplate}"
DatasetFieldTemplate="{StaticResource TableRowDatasetFieldDataTemplate}"
DateFieldTemplate="{StaticResource TableRowDateFieldDataTemplate}"
DateTimeFieldTemplate="{StaticResource TableRowDateTimeFieldDataTemplate}"
DropdownFieldTemplate="{StaticResource TableRowDropdownFieldDataTemplate}"
FileFieldTemplate="{StaticResource TableRowFileFieldDataTemplate}"
GpsFieldTemplate="{StaticResource TableRowGpsFieldDataTemplate}"
GridFieldTemplate="{StaticResource TableRowGridFieldDataTemplate}"
ImageFieldTemplate="{StaticResource TableRowImageFieldDataTemplate}"
LabelFieldTemplate="{StaticResource TableRowLabelFieldDataTemplate}"
MultichoiceCheckboxFieldTemplate="{StaticResource TableRowMultichoiceCheckboxFieldDataTemplate}"
RadioFieldTemplate="{StaticResource TableRowRadioFieldDataTemplate}"
RangeSliderFieldTemplate="{StaticResource TableRowRangeSliderFieldDataTemplate}"
SignatureFieldTemplate="{StaticResource TableRowSignatureFieldDataTemplate}"
SplitterFieldTemplate="{StaticResource TableRowSplitterFieldDataTemplate}"
TextFieldTemplate="{StaticResource TableRowTextFieldDataTemplate}"
TextareaFieldTemplate="{StaticResource TableRowTextareaFieldDataTemplate}"
TimeFieldTemplate="{StaticResource TableRowTimeFieldDataTemplate}"
VideoFieldTemplate="{StaticResource TableRowVideoFieldDataTemplate}"/>
</UserControl.Resources>
<Grid>
<ItemsControl ItemsSource="{Binding Source={StaticResource FieldViewModelsSource}}"
ItemTemplateSelector="{StaticResource FieldViewModelDataTemplateSelector}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Margin="10,0,10,0" Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</UserControl>
请注意,UserControl
资源中的 DataTemplate
资源是基于 ViewModel 中的 objects 加载的自定义 UserControl
资源(如 my original image 1).
非常感谢@LovetoCode,我设法解决了我的问题。不过,我仍在努力克服因头撞桌子而引起的 2 天头痛和瘀伤。
我放弃了 ScrollViewer
,只使用了我的习惯 UserControl
:
<local:TableRowUserControl Grid.Row="1" Grid.ColumnSpan="2"
Margin="66,0,66,40" HorizontalContentAlignment="Stretch" />
然后,正如@LovetoCode 所建议的那样——我使用了 ListView
而不是 ItemsControl
。我最诚挚的歉意。我不想第一次使用一个因为...
主要问题是 ListView
的默认样式具有悬停和点击效果;我不需要。我试图避免从以前的失败经验中禁用 hover/tap - 悲惨地。
经过一些谷歌搜索(其他搜索引擎可用)后,我找到了一个简单的解决方案来轻松完成此操作。
我设法做到了:
<ListView x:Name="lstFieldViewModels" ItemsSource="{Binding Source={StaticResource FieldViewModelsSource}}" SelectionMode="None"
ItemTemplateSelector="{StaticResource FieldViewModelDataTemplateSelector}" IsSwipeEnabled="False">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Margin="10,0,10,0" Orientation="Vertical" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
再次感谢@LovetoCode。金星和程序员积分给你:)
场景:
我正在 WinRT/Win8.
我有一个 ScrollView
,里面有一个自定义的 UserControl
child - 都是一个 "main" UserControl
.
当主要 UserControl
(与 ScrollView
-> child UserControl
)在 Initialized/navigated 时 - 即使应用宽度 不是full-screen; UserControl
处于 ScrollView
的全宽 - 根据需要。下图:
- Image 1 - main User Control Opens with Window Fullscreen
- Image 2 - main User Control Opens Starts Half-Width (or any width)
ScrollView
本身位于 Grid
内,并与应用程序 window 的整个宽度保持一致,即使根据需要调整大小也是如此。
问题:
我遇到的问题是,当我水平调整 App window 大小时,child UserControl
的宽度与其 parent ScrollView
的宽度不同s.
这会导致 ScrollView
出现水平滚动条——这是我不想要的。
我想将 child 的宽度限制在 ScrollView
的宽度内,没有水平滚动条(如 Image 2)。
Markup 与此类似(为了便于阅读,我已将其精简):
<Grid>
<!-- Some row/column definitions in here -->
...
<!-- A header TextBlock -->
...
<ScrollViewer x:Name="scrlTableRows" Grid.ColumnSpan="3" Grid.Row="1"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
Padding="66,0,66,40" ZoomMode="Disabled">
<local:MyCustomUserControl Margin="0,10,0,10" HorizontalAlignment="Stretch" />
</ScrollViewer>
...
<!-- Just a button here-->
</Grid>
我已经尝试过设置(在child自定义UserControl
):
Width="{Binding Path=ActualWidth, ElementName=scrlTableRows}"
child 不是 设置为ScrollView
的全宽开始(这是我需要的),并且不会调整宽度parent 或者 - 给我滚动条Width="{Binding Path=Width, ElementName=scrlTableRows}"
child 从 parent 的全宽开始,但不调整大小- 给我滚动条我也试过将
UserControl
放在Grid
内(在ScrollView
内),还有许多其他HorizontalAligment
和Width
属性。
一切都无济于事。
Whosebug 的其他有帮助的同事没有其他类似的 situations/answers 工作。
显然,我需要垂直滚动条——这是显而易见的;在任何人问之前。
请问有人能给我指点吗?
更新:
这是自定义 UserControl
的 Xaml,应 @LovetoCode 的要求:
<UserControl *usual user control declaritive stuff in here*>
<UserControl.Resources>
<CollectionViewSource x:Key="FieldViewModelsSource" Source="{Binding ItemToEdit.FieldViewModels}"/>
<datatemplateselectors:FieldViewModelDataTemplateSelector
x:Key="FieldViewModelDataTemplateSelector"
AudioFieldTemplate="{StaticResource TableRowAudioFieldDataTemplate}"
CheckboxFieldTemplate="{StaticResource TableRowCheckboxFieldDataTemplate}"
DatasetFieldTemplate="{StaticResource TableRowDatasetFieldDataTemplate}"
DateFieldTemplate="{StaticResource TableRowDateFieldDataTemplate}"
DateTimeFieldTemplate="{StaticResource TableRowDateTimeFieldDataTemplate}"
DropdownFieldTemplate="{StaticResource TableRowDropdownFieldDataTemplate}"
FileFieldTemplate="{StaticResource TableRowFileFieldDataTemplate}"
GpsFieldTemplate="{StaticResource TableRowGpsFieldDataTemplate}"
GridFieldTemplate="{StaticResource TableRowGridFieldDataTemplate}"
ImageFieldTemplate="{StaticResource TableRowImageFieldDataTemplate}"
LabelFieldTemplate="{StaticResource TableRowLabelFieldDataTemplate}"
MultichoiceCheckboxFieldTemplate="{StaticResource TableRowMultichoiceCheckboxFieldDataTemplate}"
RadioFieldTemplate="{StaticResource TableRowRadioFieldDataTemplate}"
RangeSliderFieldTemplate="{StaticResource TableRowRangeSliderFieldDataTemplate}"
SignatureFieldTemplate="{StaticResource TableRowSignatureFieldDataTemplate}"
SplitterFieldTemplate="{StaticResource TableRowSplitterFieldDataTemplate}"
TextFieldTemplate="{StaticResource TableRowTextFieldDataTemplate}"
TextareaFieldTemplate="{StaticResource TableRowTextareaFieldDataTemplate}"
TimeFieldTemplate="{StaticResource TableRowTimeFieldDataTemplate}"
VideoFieldTemplate="{StaticResource TableRowVideoFieldDataTemplate}"/>
</UserControl.Resources>
<Grid>
<ItemsControl ItemsSource="{Binding Source={StaticResource FieldViewModelsSource}}"
ItemTemplateSelector="{StaticResource FieldViewModelDataTemplateSelector}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Margin="10,0,10,0" Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</UserControl>
请注意,UserControl
资源中的 DataTemplate
资源是基于 ViewModel 中的 objects 加载的自定义 UserControl
资源(如 my original image 1).
非常感谢@LovetoCode,我设法解决了我的问题。不过,我仍在努力克服因头撞桌子而引起的 2 天头痛和瘀伤。
我放弃了 ScrollViewer
,只使用了我的习惯 UserControl
:
<local:TableRowUserControl Grid.Row="1" Grid.ColumnSpan="2"
Margin="66,0,66,40" HorizontalContentAlignment="Stretch" />
然后,正如@LovetoCode 所建议的那样——我使用了 ListView
而不是 ItemsControl
。我最诚挚的歉意。我不想第一次使用一个因为...
主要问题是 ListView
的默认样式具有悬停和点击效果;我不需要。我试图避免从以前的失败经验中禁用 hover/tap - 悲惨地。
经过一些谷歌搜索(其他搜索引擎可用)后,我找到了一个简单的解决方案来轻松完成此操作。
我设法做到了:
<ListView x:Name="lstFieldViewModels" ItemsSource="{Binding Source={StaticResource FieldViewModelsSource}}" SelectionMode="None"
ItemTemplateSelector="{StaticResource FieldViewModelDataTemplateSelector}" IsSwipeEnabled="False">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListViewItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Margin="10,0,10,0" Orientation="Vertical" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
再次感谢@LovetoCode。金星和程序员积分给你:)