ScrollView的孩子没有正确调整窗口大小调整WinRT

时间:2016-05-09 09:52:27

标签: c# xaml windows-runtime

情境:
我正在使用WinRT / Win8中的商店应用程序。

我有一个ScrollView,其中包含一个自定义UserControl子项 - 所有这些都是&#34; main&#34; UserControl的一部分。< / p>

主要UserControlScrollView - &gt;子UserControl)in初始化/导航到 - 即使App宽度已满-屏幕;根据需要,UserControl的宽度为ScrollView。下图:

ScrollView本身位于Grid范围内,并且与App窗口的整个宽度保持一致,即使它已根据需要调整大小。

问题:
我遇到的问题是,当我横向调整App窗口的大小时,子UserControl的宽度与其父ScrollView的宽度不同。

这会导致ScrollView拥有水平滚动条 - 这是我不想要的。

我希望将子项的宽度保持在ScrollView的宽度内,而不使用水平滚动条(如Image 2中所示)。

标记与此相似(为了便于阅读,我已将其删除):

<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>

我已尝试设置(在子自定义UserControl上):

  • Width="{Binding Path=ActualWidth, ElementName=scrlTableRows}" 孩子不是设置在ScrollView的整个宽度开始(这是我需要的),并且没有调整其父级的宽度 - 给我滚动条

  • Width="{Binding Path=Width, ElementName=scrlTableRows}"孩子 从父母的全宽开始,但没有调整大小 - 给我滚动条

  • 我还尝试将UserControl置于GridScrollView内),以及许多其他HorizontalAligmentWidth属性中。

一切都无济于事。

StackOverflow的其他有用的研究员没有其他类似的情况/答案。

显然,我需要垂直滚动条 - 这是显而易见的;在有人问之前。

有人可以给我任何指示吗?

更新

根据@LovetoCode的要求,以下是自定义UserControl的Xaml:

<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>

请注意,DataTemplate资源中的UserControl资源是基于ViewModel中的对象加载的自定义UserControl(如my original image 1中所示)。

1 个答案:

答案 0 :(得分:0)

所以,非常感谢@LovetoCode,我设法解决了我的问题。尽管如此,仍然试图克服我头部撞到桌子上的2天头痛和瘀伤。

我放弃了ScrollViewer并使用了我的自定义UserControl

<local:TableRowUserControl Grid.Row="1" Grid.ColumnSpan="2"
                           Margin="66,0,66,40" HorizontalContentAlignment="Stretch" />

然后,正如@LovetoCode建议的那样 - 我使用ListView代替ItemsControl。我最诚挚的道歉。我不想第一次使用,因为......

主要问题是使用ListView的默认样式来悬停和点按效果;这是我不需要的。我试图避免在以前的失败经历中禁用悬停/点击 - 很糟糕。

经过一些谷歌搜索(其他搜索引擎可用),我找到了一个简单的解决方案,很容易做到这一点。

我设法做到了这样:

<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的道具。金星和程序员为你指点:)