0

我试图弄清楚如何在控件展开或折叠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"对我不起作用。Expander 会扩展,但窗口大小不会改变。

更新:问题现在解决了。问题在于固定高度。因此,如果您想SizeToContent完成所有脏活,则永远不要在. 当您指定 UserControl 的固定高度时,您必须在您的 UserControl 类的和处理程序中自行处理大小更改。我的应用程序布局现在很好:HeightExpandDirection="Down"Expanded()Collapsed()

在此处输入图像描述

4

2 回答 2

1

您确实可以使用该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从这里获取实例并调整它的大小。这里的关键原则是解耦UCForm通过强制在MainWindow. 如果有一天您想在其他地方(另一个窗口、另一个应用程序甚至 WPF 之外)使用您的控件怎么办?

于 2020-09-26T21:33:07.967 回答
0

如果您想自己更改 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;
}
于 2020-10-04T11:59:37.503 回答