2017-02-04 4 views
1

Я создаю простое приложение, в котором я создаю элементы пользовательского класса во время выполнения (класс состоит из некоторых элементов управления: текстовые блоки, сетки). Так как моя рабочая область легко перенаселена, я хочу, чтобы главная сетка моего приложения прокручивалась.Прокручиваемое окно WPF с динамически создаваемыми элементами?

Я инкапсулировал свою сетку в средство просмотра прокрутки, и я намерен увеличить ширину и высоту сетки таким образом, чтобы появлялись горизонтальные и вертикальные полосы прокрутки. Моя проблема, однако, в том, что я не знаю, как проверить, действительно ли экземпляр моего пользовательского класса полностью в рабочей области или его части. Я нашел метод в SO, который мог бы решить мою проблему HERE, но поскольку у меня много элементов, мне нужно будет проверить каждый из них. Есть ли другой способ, который будет легко работать?

Кроме того, я должен знать, в какой степени мой элемент выходит за пределы области, так что я только увеличиваю размер сетки соответственно. Я новичок в WPF, поэтому любые предложения очень ценятся!

Вот моя идея схематически: enter image description here Вот соответствующая часть моего XAML:

<ScrollViewer VerticalScrollBarVisibility="Visible" 
       HorizontalScrollBarVisibility="Auto" 
       CanContentScroll="True"> 
    <Grid 
    x:Name="MainGrid" 
    Background="Transparent" 
    MouseLeftButtonUp="grid_MouseLeftButtonUp"> 
     <ItemsControl> 
      <!--HERE I HAVE A NUMBER OF OTHER ELEMENTS PREDEFINED--> 
     </ItemsControl> 
     <Grid.ContextMenu> 
      <!--HERE I HAVE CONTEXTMENU ELEMENTS--> 
     </Grid.ContextMenu> 

    </Grid> 
</ScrollViewer> 

ответ

1

Сетка должна быть в состоянии обрабатывать автоматическую калибровку для вас, если вы используете свойство Margin пунктов в положение их. Пример, в котором элементы не полностью вписываются в поле зрения:

<Window x:Class="WpfApplication1.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:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="400" Width="400"> 

    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
     <Grid x:Name="MainGrid" Background="Transparent"> 
      <Border Background="Blue" Width="250" Height="250" Margin="350 0 0 0" HorizontalAlignment="Left" VerticalAlignment="Top"></Border> 
      <Border Background="Red" Width="250" Height="250" Margin="0 150 0 0" HorizontalAlignment="Left" VerticalAlignment="Top"></Border> 
     </Grid> 
    </ScrollViewer> 
</Window> 

Приведенный выше пример делает скроллбары видимым:

WPF Grid Scrollview

Там нет полосы прокрутки, если содержание соответствует вид:

WPF Scrollview Grid content fits

Есть несколько других доступных вариантов, например, с использованием небольшого модифицированного холста. Вы можете найти еще несколько примеров отсюда: WPF: How to make canvas auto-resize?

+0

На самом деле, я использую холст внутри сетки (определенный в шаблоне данных insd ItemsControl), потому что мне нужно абсолютное позиционирование: элементы пользовательского класса отображаются на кнопке buttonClickEvent, где точки мыши, поэтому они находятся на холсте, а я обрабатываю события мыши на внешней сетке. Проблема заключается в следующем: как получить холст внутри сетки, чтобы сделать сетку больше? Извините, я не был конкретным в этом. – rTECH

Смежные вопросы