我知道在将窗口分割成不同的部分时,有几种选择可供使用(例如DockPanel,StackPanel等)。我的Windows应用程序要求用户能够在运行时调整不同部分的大小,类似于用户可以调整HTML中FRAME宽度的方式。有人有什么建议,在C#WPF中使用哪种类型的控件来完成这个任务?如果您有任何代码示例,演示如何在鼠标悬停在部分边界并单击保持以调整大小,那将是理想的。
我知道在将窗口分割成不同的部分时,有几种选择可供使用(例如DockPanel,StackPanel等)。我的Windows应用程序要求用户能够在运行时调整不同部分的大小,类似于用户可以调整HTML中FRAME宽度的方式。有人有什么建议,在C#WPF中使用哪种类型的控件来完成这个任务?如果您有任何代码示例,演示如何在鼠标悬停在部分边界并单击保持以调整大小,那将是理想的。
System.Windows.Controls.GridSplitter
http://msdn.microsoft.com/en-us/library/system.windows.controls.gridsplitter.aspx
Example:
<Grid VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="5" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ListBox Grid.Row="0" >
<TextBlock>Hello</TextBlock>
</ListBox>
<GridSplitter Grid.Row="1"
Height="5" Background="Gray"
VerticalAlignment="Top"
HorizontalAlignment="Stretch" />
<ListBox Grid.Row="2" >
<TextBlock>World</TextBlock>
</ListBox>
</Grid>
var topTB = new TextBox();
var middleTB = new TextBox();
var bottomTB = new TextBox();
var g = MakeSideBySideFrames(this.Root, topTB, middleTB, bottomTB);
g.Height = 300.0;
public Grid MakeTopBottomFrames(Panel parent, params UIElement[] items)
{
return MakeFrames(parent,
newPosition: (g, len) => { g. RowDefinitions.Add(new RowDefinition { Height = len }); },
setPosition: (item, inx) => { Grid.SetRow(item, inx); },
items: items);
}
public Grid MakeSideBySideFrames(Panel parent, params UIElement[] items)
{
return MakeFrames(parent,
newPosition: (g, len) => { g.ColumnDefinitions.Add(new ColumnDefinition { Width = len }); },
setPosition: (item, inx) => { Grid.SetColumn(item, inx); },
items: items);
}
Grid MakeFrames(Panel parent,
Action<Grid, GridLength> newPosition,
Action<UIElement, int> setPosition,
params UIElement[] items
)
{
var g = new Grid();
parent.Children.Add(g);
for (var inx = 0; inx < items.Length; inx++)
{
if (inx > 0)
{
newPosition(g, new GridLength(5));
var gs = new GridSplitter();
g.Children.Add(gs);
setPosition(gs, (inx * 2) - 1);
gs.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
gs.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
gs.Background = new SolidColorBrush(Colors.Black);
gs.ShowsPreview = true;
}
newPosition(g, new GridLength(1, GridUnitType.Star));
g.Children.Add(items[inx]);
setPosition(items[inx], inx * 2);
}
return g;
}