我有一个用户控件(状态栏),它有一个隐式最小大小(不是通过属性设置的,我的意思是当它达到最小大小时,它不能被减小并被裁剪)。
有没有办法让主窗口知道用户控件即将被裁剪并防止其缩小?使用WPF这样智能的布局系统,它一定知道正在裁剪什么。请看下面的图像:
我有一个用户控件(状态栏),它有一个隐式最小大小(不是通过属性设置的,我的意思是当它达到最小大小时,它不能被减小并被裁剪)。
有没有办法让主窗口知道用户控件即将被裁剪并防止其缩小?使用WPF这样智能的布局系统,它一定知道正在裁剪什么。请看下面的图像:
在 <Window>
部分内包含 MinHeight="MinSize" MinWidth="MinSize"
其中 MinSize 为期望的整数值,例如 400/350 等。
<Window x:Class="IOTA_WPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
WindowState="Maximized"
MinHeight="400" MinWidth="650">
<Window ...
SizeToContent="WidthAndHeight" >
接下来,我设置每个嵌入式控件以报告所需的宽度和高度。大多数内置控件会自动完成此操作。对于自定义控件,您可以通过重写MeasureOverride方法或仅为控件设置宽度和高度来完成此操作。将其设置为您希望控件获得的最小大小。
<MyControl Name="_MyControlName" Width="640" Height="480" />
不要担心这些“硬编码”的值会影响控件的行为。我们接下来会处理这个问题。现在,当窗口显示时,它将自动调整自己以适应您的控件。
接下来,订阅窗口加载事件。
<Window ...
SizeToContent="WidthAndHeight" Loaded="Window_Loaded" >
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// We know longer need to size to the contents.
ClearValue(SizeToContentProperty);
// We want our control to shrink/expand with the window.
_MyControlName.ClearValue(WidthProperty);
_MyControlName.ClearValue(HeightProperty);
// Don't want our window to be able to get any smaller than this.
SetValue(MinWidthProperty, this.Width);
SetValue(MinHeightProperty, this.Height);
}
你放置在Window_Loaded方法中的内容将取决于你想实现的行为。
希望这能帮助其他人节省时间。
Loaded
中执行似乎会防止WindowStartupLocation="CenterOwner"
起作用。如果我改为在ContentRendered
中执行,则可以获得正确的窗口位置,并且最小大小仍然有效。 - fadden您可以将控件的MinHeight属性设置为防止其变得比所需更小。
public class ExtendedUserControl : UserControl
{
public static readonly RoutedEvent ContentChangedEvent
= EventManager.RegisterRoutedEvent(
"ContentChanged",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(ExtendedUserControl));
public event RoutedEventHandler ContentChanged
{
add { AddHandler(ContentChangedEvent, value); }
remove { RemoveHandler(ContentChangedEvent, value); }
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
RaiseEvent(new RoutedEventArgs(ContentChangedEvent, this));
}
}
2.) 将事件附加到您的UserControl
<extended:ExtendedUserControl Height="auto" Width="auto" cal:View.Model="{Binding CurrentModel}" ContentChanged="ExtendedUserControl_ContentChanged"/>
3.) 更新 现在我们来到解决方案的最后一部分。
private void ExtendedUserControl_ContentChanged(object sender, System.Windows.RoutedEventArgs e)
{
Thread task = new Thread(() =>
{
Dispatcher.Invoke(() =>
{
SizeToContent = SizeToContent.WidthAndHeight;
MinHeight = Height;
MinWidth = Width;
});
});
task.Start();
}
干杯
你能否将项目放入包含组成部分的行网格中?
所有必须具有最小高度的项目都可以放在具有类似最小高度的行中。
将最小高度相加= Window.MinHeight。因此,窗口永远不能比必要行的集体最小高度更小,因此这些行应始终显示。
我记得在某个地方(可能是我错了)读到过,堆栈面板基于无限大具有边框,不能处理这种大小问题。
来自http://msdn.microsoft.com/en-us/library/ms754152.aspx
DockPanel vs StackPanel
尽管DockPanel也可以“堆叠”子元素,但在某些使用场景中,DockPanel和StackPanel并不产生类似的结果。例如,在DockPanel中,子元素的顺序会影响它们的大小,但在StackPanel中则不会。这是因为StackPanel在堆叠方向上测量PositiveInfinity,而DockPanel仅测量可用大小。
帖子中还有一个关于嵌套面板的部分,这可能是您需要的。
或者在底部行中使用网格状态?