如何使用 Expander 控件自动调整大小以适应 Window 的内容?

How to automatically resize to content a Window with an Expander control?

我想弄清楚如何在展开或折叠 Expander 控件后调整应用程序 Window 的大小。它必须增长或收缩。我之前在Whosebug上看到的所有案例都建议设置SizeToContent="WidthAndHeight"。这是正确的工作流程还是我应该手动更改尺寸?

该应用程序由 MainWindowStackPanel 中基于 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 的实例并从这里调整它的大小。这里的关键原则是解耦:让你的UCFormre-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;
}