Создайте пользовательский контроль с ScrollView - PullRequest
0 голосов
/ 29 марта 2019

У меня есть проект WPF.

В этом проекте у меня есть UserControl со StackPanel, содержащим различные элементы. Это внутри клетки в сетке. Когда я изменяю размеры Windwo, и Ячейка становится маленькой, чтобы соответствовать Панели Стекла, я хочу, чтобы завиток завладел.

Я пытался поместить TheUserControl в a, но это, похоже, работает только с Set size. Мне нужно, чтобы настроить динамический размер ячейки. Все «решения», которые я нашел в Интернете, были ненужными трудными обходными путями для такой простой и обычной проблемы. Поэтому я уверен, что есть простой способ добиться такого поведения.

Псевдо-код

Пользовательский контроль:

<UserControl x:class=x.TheUserControl>
    <StackPanel>
        <Label Content="Label 01 />
        <Label Content="Label 02 />
        <Label Content="Label 03 />
                     .
                     .
                     .
        <Label Content="Label n />
    </StackPanel>
</UserControl>

Окно:

<Window x:Class="x.MainWindow>
<Grid>

    <Grid.RowDefinitions>
       <RowDefinition Height="auto" />
       <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Label Content="Header" />

    <ScrollView Grid.Row="1">
        <x:TheUserControl />
    </ScrollView>

</Window>

Я почти уверен, что ScrollView отлично работает, когда я помещаю StackPAnel непосредственно в ScrollView, так почему же это так сложно с промежуточным элементом UserControl?

Я не знаю о каком-то очевидном поведении в ScrollView, и я был бы очень рад, если бы кто-то мог показать мне лучший подход или объяснить, почему он так себя ведет.

1 Ответ

0 голосов
/ 29 марта 2019

Пожалуйста, попробуйте использовать ScrollViewer внутри вашего usercontrol и использовать HorizontalScrollBarVisibility & VerticalScrollBarVisibility:

userControl:

<UserControl x:Class="WpfApp1.TheUserControl"
             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:WpfApp1"
             >
    <Grid>
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <StackPanel Orientation="Vertical"  Background="LightGray">
                <Label Content="Label 01" />
                <Label Content="Label 02" />
                <Label Content="Label 03" />
                <Label Content="Label n" />
            </StackPanel>
        </ScrollViewer>
    </Grid>
</UserControl>

MainWindow:

<Window x:Class="WpfApp1.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:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" >
    <Grid Background="Aqua">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Label Content="Header" Grid.Row="0" />
        <local:TheUserControl Grid.Row="1" />

    </Grid>
</Window>

Результат, еслиВы изменяете размер окна:

Usercontrol with Scrollviewer inside

...