具有动态创建元素的可滚动WPF窗口?

具有动态创建元素的可滚动WPF窗口?,wpf,scrollviewer,Wpf,Scrollviewer,我正在创建一个简单的应用程序,其中我在运行时实例化了一个自定义类的元素(该类由一些控制元素组成:Textblocks、Grids)。由于我的工作区域很容易人口过剩,我希望我的应用程序的主网格可以滚动 我将网格封装在一个滚动查看器中,并打算通过这种方式增加网格的宽度和高度,以显示水平和垂直滚动条。然而,我的问题是,我不知道如何检查自定义类的实例是否完全在工作区内,或者它的一部分是否伸出工作区。我在中找到了一个可以解决我的问题的方法,但是因为我有很多元素,所以我必须检查每一个元素。是否有另一种方法可

我正在创建一个简单的应用程序,其中我在运行时实例化了一个自定义类的元素(该类由一些控制元素组成:Textblocks、Grids)。由于我的工作区域很容易人口过剩,我希望我的应用程序的主网格可以滚动

我将网格封装在一个滚动查看器中,并打算通过这种方式增加网格的宽度和高度,以显示水平和垂直滚动条。然而,我的问题是,我不知道如何检查自定义类的实例是否完全在工作区内,或者它的一部分是否伸出工作区。我在中找到了一个可以解决我的问题的方法,但是因为我有很多元素,所以我必须检查每一个元素。是否有另一种方法可以提高性能

此外,我必须知道我的元素超出面积的程度,这样我只能相应地增加网格的大小。我是WPF的新手,所以任何建议都非常感谢

下面是我的想法示意图: 以下是我的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>

如果使用项目的边距属性定位项目,网格应该能够为您处理自动调整大小。项目不完全适合视图的示例:

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

上述示例使滚动条可见:

如果内容符合视图,则没有滚动条:


还有一些其他的选择,比如使用一个修改过的画布。您可以从这里找到更多示例:

实际上,我在网格内使用画布(在ItemsControl中的数据模板中定义),因为我需要绝对定位:自定义类元素显示在鼠标指向的buttonClickEvent上,因此它们位于画布上,而我在外部网格上处理鼠标事件。因此,问题是:如何将画布放在网格中以使网格更大?对不起,我没有具体说明。