为什么 UWP 中用户 UserControl 内的滚动查看器不起作用......有什么建议吗?

Why the Scroll-viewer inside user UserControl in UWP is not working ....any advice?

我正在使用 https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.scrollviewer 中提供的示例代码在 UWP UserControl 中创建滚动查看器,如下所示,UserControl 不起作用

 <UserControl
    x:Class="Controls.Custom"
    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:converters="using:Microsoft.Toolkit.Uwp.UI.Converters"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400"
    DataContext="{Binding ViewModel, Source={StaticResource ViewModelLoc}}">

        <Grid>
        <StackPanel Height="300" Width="300">
            <!-- A large TextBlock. -->
            <TextBlock Width="300" TextWrapping="Wrap" Margin="0,0,0,30" 
                       Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac mi ipsum. Phasellus vel malesuada mauris. Donec pharetra, enim sit amet mattis tincidunt, felis nisi semper lectus, vel porta diam nisi in augue. Pellentesque lacus tortor, aliquam et faucibus id, rhoncus ut justo. Sed id lectus odio, eget pulvinar diam. Suspendisse eleifend ornare libero, in luctus purus aliquet non. Sed interdum, sem vitae rutrum rhoncus, felis ligula ultrices sem, in eleifend eros ante id neque." />

            <!-- The same large TextBlock, wrapped in a ScrollViewer. -->
            <ScrollViewer Height="200" Width="200" 
                          HorizontalScrollBarVisibility="Auto" 
                          VerticalScrollBarVisibility="Auto">
                <TextBlock Width="300" TextWrapping="Wrap"
                           Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac mi ipsum. Phasellus vel malesuada mauris. Donec pharetra, enim sit amet mattis tincidunt, felis nisi semper lectus, vel porta diam nisi in augue. Pellentesque lacus tortor, aliquam et faucibus id, rhoncus ut justo. Sed id lectus odio, eget pulvinar diam. Suspendisse eleifend ornare libero, in luctus purus aliquet non. Sed interdum, sem vitae rutrum rhoncus, felis ligula ultrices sem, in eleifend eros ante id neque." />
            </ScrollViewer>
        </StackPanel>
    </Grid>
</UserControl>

但是

<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
        <StackPanel>
            <!-- A large TextBlock. -->
            <TextBlock Width="300" TextWrapping="Wrap" Margin="0,0,0,30" 
                       Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac mi ipsum. Phasellus vel malesuada mauris. Donec pharetra, enim sit amet mattis tincidunt, felis nisi semper lectus, vel porta diam nisi in augue. Pellentesque lacus tortor, aliquam et faucibus id, rhoncus ut justo. Sed id lectus odio, eget pulvinar diam. Suspendisse eleifend ornare libero, in luctus purus aliquet non. Sed interdum, sem vitae rutrum rhoncus, felis ligula ultrices sem, in eleifend eros ante id neque." />

            <!-- The same large TextBlock, wrapped in a ScrollViewer. -->
            <ScrollViewer Height="200" Width="200" 
                          HorizontalScrollBarVisibility="Auto" 
                          VerticalScrollBarVisibility="Auto">
                <TextBlock Width="300" TextWrapping="Wrap"
                           Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac mi ipsum. Phasellus vel malesuada mauris. Donec pharetra, enim sit amet mattis tincidunt, felis nisi semper lectus, vel porta diam nisi in augue. Pellentesque lacus tortor, aliquam et faucibus id, rhoncus ut justo. Sed id lectus odio, eget pulvinar diam. Suspendisse eleifend ornare libero, in luctus purus aliquet non. Sed interdum, sem vitae rutrum rhoncus, felis ligula ultrices sem, in eleifend eros ante id neque." />
            </ScrollViewer>
        </StackPanel>
    </Grid>
</Page>

有效!。关于如何在 UserControl 中使用滚动查看器有什么建议吗?

在您的代码中,堆栈面板是父级,而 ScrollViewer 作为子级工作如果您声明堆栈面板的高度和宽度,则需要将 MaxHeight 和 MaxWidth 分配给 ScrollViewer。您需要将内部文本框高度设置为 200

  <Grid>
        <StackPanel Height="300" Width="300">
            <!-- A large TextBlock. -->
            <TextBlock Width="300" TextWrapping="Wrap" Margin="0,0,0,30" 
                       Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac mi ipsum. Phasellus vel malesuada mauris. Donec pharetra, enim sit amet mattis tincidunt, felis nisi semper lectus, vel porta diam nisi in augue. Pellentesque lacus tortor, aliquam et faucibus id, rhoncus ut justo. Sed id lectus odio, eget pulvinar diam. Suspendisse eleifend ornare libero, in luctus purus aliquet non. Sed interdum, sem vitae rutrum rhoncus, felis ligula ultrices sem, in eleifend eros ante id neque." />

            <!-- The same large TextBlock, wrapped in a ScrollViewer. -->
            <ScrollViewer MaxHeight="200" MaxWidth="200" 
                          HorizontalScrollBarVisibility="Auto" 
                          VerticalScrollBarVisibility="Auto">
                <TextBlock Width="200" TextWrapping="Wrap"
                           Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac mi ipsum. Phasellus vel malesuada mauris. Donec pharetra, enim sit amet mattis tincidunt, felis nisi semper lectus, vel porta diam nisi in augue. Pellentesque lacus tortor, aliquam et faucibus id, rhoncus ut justo. Sed id lectus odio, eget pulvinar diam. Suspendisse eleifend ornare libero, in luctus purus aliquet non. Sed interdum, sem vitae rutrum rhoncus, felis ligula ultrices sem, in eleifend eros ante id neque." />
            </ScrollViewer>
        </StackPanel>
    </Grid>

UserControl 不起作用的原因是您将 StackPanel 的高度设置为 300,但子内容需要超过 300 的高度,然后子内容在视觉上被剪裁。所以可以去掉StackPanel中的高度限制或者控制子内容的总高度不超过300

<UserControl ...>
    <Grid>
        <StackPanel Width="300">
            <!-- A large TextBlock. -->
            <TextBlock Width="300" TextWrapping="Wrap" Margin="0,0,0,30"
                       Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac mi ipsum. Phasellus vel malesuada mauris. Donec pharetra, enim sit amet mattis tincidunt, felis nisi semper lectus, vel porta diam nisi in augue. Pellentesque lacus tortor, aliquam et faucibus id, rhoncus ut justo. Sed id lectus odio, eget pulvinar diam. Suspendisse eleifend ornare libero, in luctus purus aliquet non. Sed interdum, sem vitae rutrum rhoncus, felis ligula ultrices sem, in eleifend eros ante id neque." />

            <!-- The same large TextBlock, wrapped in a ScrollViewer. -->
            <ScrollViewer Height="200" Width="200" 
                          HorizontalScrollBarVisibility="Auto" 
                          VerticalScrollBarVisibility="Auto">
                <TextBlock Width="300" TextWrapping="Wrap"
                           Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ac mi ipsum. Phasellus vel malesuada mauris. Donec pharetra, enim sit amet mattis tincidunt, felis nisi semper lectus, vel porta diam nisi in augue. Pellentesque lacus tortor, aliquam et faucibus id, rhoncus ut justo. Sed id lectus odio, eget pulvinar diam. Suspendisse eleifend ornare libero, in luctus purus aliquet non. Sed interdum, sem vitae rutrum rhoncus, felis ligula ultrices sem, in eleifend eros ante id neque." />
            </ScrollViewer>
        </StackPanel>
    </Grid>
</UserControl>