问题描述
我试图找出在Window
控件被展开或折叠后如何调整应用程序Expander
的大小。它必须增长或收缩。我之前在StackOverflow上看到的所有情况都建议设置SizetoContent="WidthAndHeight"
。是正确的工作流程还是应该手动更改大小?
应用程序由MainWindow
和Expander
中基于StackPanel
的用户控件组成:
<Window x:Class="WpfAppBlend.MainWindow"
Title="MainWindow" Width="517" Height="298"
SizetoContent="Manual" ResizeMode="noresize"
SizeChanged="Window_SizeChanged">
<StackPanel>
<local:UCForm/>
</StackPanel>
</Window>
这是我的UserControl
:
<UserControl x:Class="WpfAppBlend.UCForm"
d:DesignWidth="500" d:DesignHeight="320"
Width="500" Height="320">
<Grid>
<Expander ExpandDirection="Down" Header="Bookmarks"
Expanded="Expander_Expanded"
Collapsed="Expander_Collapsed">
<TextBlock>
Some text here...
</TextBlock>
</Expander>
</Grid>
</UserControl>
在我的UserControl
代码后面,我有两个空的事件处理程序:
public partial class UCForm : UserControl
{
private void Expander_Expanded(object sender,RoutedEventArgs e){
// How to get the instance of the Main Window here
// to change it's Height?
}
private void Expander_Collapsed(object sender,RoutedEventArgs e){
// How to get the instance of the Main Window here
// to change it's Height?
}
}
我的MainWindow
类如下所示:
public partial class MainWindow : Window
{
public MainWindow(){
InitializeComponent();
}
private void Window_SizeChanged(object sender,SizeChangedEventArgs e){
}
}
这就是我所拥有的:
设置SizetoContent="WidthAndHeight"
对我不起作用。
扩展器会扩展,但窗口大小不会改变。
已更新:该问题现已解决。问题是固定的高度。因此,如果您想让SizetoContent
来完成所有肮脏的工作,则–您应该从不永不,在{{情况下,请指定UserControl的Height
(仅宽度) 1}}。当您指定UserControl的固定高度时,您必须在UserControl类的ExpandDirection="Down"
和Expanded()
处理程序中自行处理大小更改。我的应用程序布局现在很好:
解决方法
您确实可以使用SizeToContent="WidthAndHeight"
选项,以便Window
自动调整大小以完全适合其内容。
但是,要使其正常运行,您需要从Width="500" Height="320"
用户控件中删除UCForm
属性,因为它们会给控件(从而使窗口内容) )固定高度。然后,Window
的大小将随着UserControl
的大小而改变。
作为旁注:
private void Expander_Expanded(object sender,RoutedEventArgs e){
// How to get the instance of the Main Window here
// to change it's Height?
}
几乎您永远都不想获取MainWindow
的实例并从此处调整其大小。此处的关键原理是解耦:通过 not 强制UCForm
内部使用MainWindow
来重用{
}
。如果有一天您想在其他地方(另一个窗口,另一个应用程序,甚至在WPF之外)使用控件,该怎么办?
如果您想自己更改UserControl的大小,请参见以下处理程序的近似代码:
private void Expander_Expanded(object sender,RoutedEventArgs e)
{
// Getting current position of the Expander Control
Point exdCtrlPos = ((Expander)sender).TranslatePoint(new Point(0,0),this);
// Y + Height of the Expander Control - Height of the UCForm Control
double delta = (exdCtrlPos.Y + ((Expander)sender).ActualHeight) - Height;
// Increasing the height of the UCForm by delta
Height += delta;
}
private void Expander_Collapsed(object sender,RoutedEventArgs e)
{
// Some code here
// Decreasing the height of the UCForm by delta
Height -= delta;
}