【问题标题】:Scrollable WPF window with dynamically created elements?具有动态创建元素的可滚动 WPF 窗口?
【发布时间】:2017-02-04 21:13:31
【问题描述】:

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

我将我的 Grid 封装在一个 Scroll Viewer 中,我打算以这种方式增加 Grid 的宽度和高度,使水平和垂直滚动条出现。然而,我的问题是,我不知道如何检查我的自定义类的实例是否完全在工作区域内,或者它的一部分延伸到工作区域之外。我在 SO 中找到了一种可以解决我的问题HERE 的方法,但是因为我有很多元素,所以我必须检查其中的每一个。是否有另一种方法可以轻松提高性能?

另外,我必须知道我的元素在多大程度上超出了该区域,因此我只相应地增加了网格的大小。我是 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>

【问题讨论】:

    标签: wpf scrollviewer


    【解决方案1】:

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

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

    上面的例子使滚动条可见:

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

    还有其他一些可用的选项,例如使用稍加修改的 Canvas。您可以从这里找到更多示例:WPF: How to make canvas auto-resize?

    【讨论】:

    • 实际上,我在网格内使用 Canvas(在 ItemsControl 中的数据模板中定义),因为我需要绝对定位:自定义类元素出现在鼠标指向的 buttonClickEvent 上,所以它们在画布上,而我在外部网格上处理鼠标事件。因此,问题是:如何让网格内的画布使网格更大?抱歉,我没有具体说明这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多