WPF动态向容器添加自定义控件的有关问题
WPF动态向容器添加自定义控件的问题
Winform中知道怎么做,但是WPF中不知道怎么加了。
需求是根据一些条件添加各种类型的用户控件,然后用户控件要从上往下的停靠着排序。
在Winform中我是先拖了一个panel
然后新建一个用户控件UserControl1 ucTemp = new UserControl1();
之后给控件赋值各种属性,然后让他自动停靠在控件上方...
ucTemp.Dock=DockStyle.Top
最后将控件赋值给Panel
Panel.Controls.Add(ucTemp);
类似于这种功能,在WPF中应该如何编写?框架(上面的Panel)应该用什么替代? 另外还有个疑问,如果控件太多变卡了,操作延迟高有没有什么好的办法?比如框架中添加了上千控件,拖拽滚动条都会有延迟(winform里)。
------解决方案--------------------
首先,在WPF中进行布局控制有几个主要的容器
Canvas是按照绝对位置定位的,很像上面的Panel这种机制;
StackPanel呢,则是基于流模式的,它没有绝对定位的概念,一批控件要么从左到右排列,要么从上而下排列
Grid,可能是用的最多的,它可以提供按照行和列的方式更好地组织控件。而事实上,在Grid里面也可以嵌入Canvas和StackPanel,他们结合可以构造出足够复杂的 界面。
Winform中知道怎么做,但是WPF中不知道怎么加了。
需求是根据一些条件添加各种类型的用户控件,然后用户控件要从上往下的停靠着排序。
在Winform中我是先拖了一个panel
然后新建一个用户控件UserControl1 ucTemp = new UserControl1();
之后给控件赋值各种属性,然后让他自动停靠在控件上方...
ucTemp.Dock=DockStyle.Top
最后将控件赋值给Panel
Panel.Controls.Add(ucTemp);
类似于这种功能,在WPF中应该如何编写?框架(上面的Panel)应该用什么替代? 另外还有个疑问,如果控件太多变卡了,操作延迟高有没有什么好的办法?比如框架中添加了上千控件,拖拽滚动条都会有延迟(winform里)。
------解决方案--------------------
首先,在WPF中进行布局控制有几个主要的容器
Canvas是按照绝对位置定位的,很像上面的Panel这种机制;
StackPanel呢,则是基于流模式的,它没有绝对定位的概念,一批控件要么从左到右排列,要么从上而下排列
Grid,可能是用的最多的,它可以提供按照行和列的方式更好地组织控件。而事实上,在Grid里面也可以嵌入Canvas和StackPanel,他们结合可以构造出足够复杂的 界面。
第一部分是XAML代码
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="我的扫雷程序" Height="516" Width="592">
<Grid>
<Button Height="23" HorizontalAlignment="Left" Margin="20,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click">初级</Button>
<Button Height="23" HorizontalAlignment="Left" Margin="101,12,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click">高级</Button>
<Canvas Margin="20,41,12,12" Name="canvas1" />
</Grid>
</Window>
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication1
{
/// <summary>
/// Window1.xaml 的交互逻辑
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
CreateButton(6, 6);
}
private void button2_Click(object sender, RoutedEventArgs e)
{
CreateButton(9, 9);
}
private void CreateButton(int x, int y)
{
canvas1.Children.Clear();
//四个方向的边距都是5
double width = (this.canvas1.ActualWidth - (x + 1) * 5) / x;
double height = (this.canvas1.ActualHeight - (y + 1) * 5) / y;
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
Button bt = new Button()
{
Width = width,
Height = height