具有动态创建元素的可滚动 WPF window?
Scrollable WPF window with dynamically created elements?
我正在创建一个简单的应用程序,其中我在运行时实例化自定义 class 的元素(class 由一些控件元素组成:文本块、网格)。由于我的工作区域很容易人满为患,我希望我的应用程序的主网格可以滚动。
我将我的网格封装在一个滚动查看器中,我打算通过这种方式增加网格的宽度和高度,使水平和垂直滚动条出现。但是,我的问题是,我不知道如何检查我的自定义实例 class 是否 完全 在工作区域内,或者它的一部分延伸到它。我在 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>
如果您使用项目的边距 属性 来定位它们,网格应该能够为您处理自动调整大小。项目不完全适合视图的示例:
<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?
我正在创建一个简单的应用程序,其中我在运行时实例化自定义 class 的元素(class 由一些控件元素组成:文本块、网格)。由于我的工作区域很容易人满为患,我希望我的应用程序的主网格可以滚动。
我将我的网格封装在一个滚动查看器中,我打算通过这种方式增加网格的宽度和高度,使水平和垂直滚动条出现。但是,我的问题是,我不知道如何检查我的自定义实例 class 是否 完全 在工作区域内,或者它的一部分延伸到它。我在 SO 中找到了一种可以解决我的问题的方法 HERE,但是因为我有很多元素,所以我必须检查每一个元素。有没有另一种方法可以轻松实现性能?
此外,我必须知道我的元素在多大程度上超出了该区域,因此我只会相应地增加网格的大小。我是 WPF 的新手,所以非常感谢任何建议!
我的想法是这样的:
<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>
以上示例使滚动条可见:
如果内容适合视图,则没有滚动条:
还有一些其他选项可用,比如使用稍微修改过的 Canvas。您可以从此处找到更多示例:WPF: How to make canvas auto-resize?