如何自动调整大小以使用Expander控件容纳窗口?

问题描述

我试图找出在Window控件被展开或折叠后如何调整应用程序Expander的大小。它必须增长或收缩。我之前在StackOverflow上看到的所有情况都建议设置SizetoContent="WidthAndHeight"。是正确的工作流程还是应该手动更改大小?

应用程序由MainWindowExpander中基于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){                        
    }
}

这就是我所拥有的:

enter image description here

设置SizetoContent="WidthAndHeight"对我不起作用。 扩展器会扩展,但窗口大小不会改变。

已更新:该问题现已解决。问题是固定的高度。因此,如果您想让SizetoContent来完成所有肮脏的工作,则–您应该从不永不,在{{情况下,请指定UserControl的Height(仅宽度) 1}}。当您指定UserControl的固定高度时,您必须在UserControl类的ExpandDirection="Down"Expanded()处理程序中自行处理大小更改。我的应用程序布局现在很好:

enter image description here

解决方法

您确实可以使用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;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...