如何使用 Expander 控件自动调整大小以适应 Window 的内容?
How to automatically resize to content a Window with an Expander control?
我想弄清楚如何在展开或折叠 Expander
控件后调整应用程序 Window
的大小。它必须增长或收缩。我之前在Whosebug上看到的所有案例都建议设置SizeToContent="WidthAndHeight"
。这是正确的工作流程还是我应该手动更改尺寸?
该应用程序由 MainWindow
和 StackPanel
中基于 Expander
的用户控件组成:
<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
class 看起来如下:
public partial class MainWindow : Window
{
public MainWindow(){
InitializeComponent();
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e){
}
}
这是我得到的:
设置SizeToContent="WidthAndHeight"
对我不起作用。
Expander 展开但 window 大小没有改变。
已更新:问题现已解决。问题是在固定的高度。因此,如果你想让 SizeToContent
完成所有脏活,——你应该 NEVER NEVER NEVER 在这种情况下指定你的 UserControl(仅宽度)的 Height
ExpandDirection="Down"
。当您指定 UserControl 的固定高度时,您必须在 UserControl class 的 Expanded()
和 Collapsed()
处理程序中自行处理大小更改。我的应用程序布局现在很好:
您确实可以使用 SizeToContent="WidthAndHeight"
选项,以便 Window
自动调整大小以完全适合其内容。
但是,要使其正常工作,您需要从 UCForm
用户控件中删除 Width="500" Height="320"
属性,因为它们赋予控件 (因此 window 内容)固定高度。您的 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
的实例并从这里调整它的大小。这里的关键原则是解耦:让你的UCForm
re-usable通过而不是强制它在MainWindow
。如果有一天您想在其他地方(另一个 window、另一个应用程序,甚至 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;
}
我想弄清楚如何在展开或折叠 Expander
控件后调整应用程序 Window
的大小。它必须增长或收缩。我之前在Whosebug上看到的所有案例都建议设置SizeToContent="WidthAndHeight"
。这是正确的工作流程还是我应该手动更改尺寸?
该应用程序由 MainWindow
和 StackPanel
中基于 Expander
的用户控件组成:
<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
class 看起来如下:
public partial class MainWindow : Window
{
public MainWindow(){
InitializeComponent();
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e){
}
}
这是我得到的:
设置SizeToContent="WidthAndHeight"
对我不起作用。
Expander 展开但 window 大小没有改变。
已更新:问题现已解决。问题是在固定的高度。因此,如果你想让 SizeToContent
完成所有脏活,——你应该 NEVER NEVER NEVER 在这种情况下指定你的 UserControl(仅宽度)的 Height
ExpandDirection="Down"
。当您指定 UserControl 的固定高度时,您必须在 UserControl class 的 Expanded()
和 Collapsed()
处理程序中自行处理大小更改。我的应用程序布局现在很好:
您确实可以使用 SizeToContent="WidthAndHeight"
选项,以便 Window
自动调整大小以完全适合其内容。
但是,要使其正常工作,您需要从 UCForm
用户控件中删除 Width="500" Height="320"
属性,因为它们赋予控件 (因此 window 内容)固定高度。您的 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
的实例并从这里调整它的大小。这里的关键原则是解耦:让你的UCForm
re-usable通过而不是强制它在MainWindow
。如果有一天您想在其他地方(另一个 window、另一个应用程序,甚至 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;
}