我有一个usercontrol(一个状态栏),它具有隐含的最小大小(不是通过属性设置的,我的意思是当它达到最小大小时,它不能被减少并且被裁剪)。
有没有办法让主窗口知道UserControl将被裁剪并且不允许它减小它的大小?有了像WPF这样的智能布局系统,它必须是一种知道它正在裁剪的方式。看下一张图片:
答案 0 :(得分:17)
在 MinHeight="MinSize" MinWidth="MinSize"
部分
<Window>
MinSize =所需的整数值ex 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">
答案 1 :(得分:10)
我知道这是事后几年,但我最近遇到了这个问题,因为我正在处理类似的问题。这就是我解决它的方式。该解决方案特定于我的问题,但可以进行修改以获得各种所需的调整大小行为。
首先设置窗口,使其最初调整大小以适合其内容。
<MyControl Name="_MyControlName" Width="640" Height="480" />
接下来,我设置每个嵌入式控件,以便报告所需的宽度和高度。大多数内置控件都可以为您完成此操作。您可以通过覆盖MeasureOverride来执行自定义控件,也可以只为控件设置宽度和高度。将其设置为您希望控件获得的最小大小。
<Window ...
SizeToContent="WidthAndHeight" Loaded="Window_Loaded" >
不要担心这些&#39;难以编码值影响控件的行为。我们下一步处理。现在,当窗口显示时,它将自动调整以适合您的控件。
接下来订阅加载窗口的事件。
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);
}
在窗口加载事件中,您可以调整窗口的大小调整行为及其中的控件。你可以使它控制可以调整大小。您可以将窗口的最小大小设置为刚刚放置的大小。这里的优点是您只需允许布局系统为您找到一个好的布局。你想利用它的工作。
Intersection(parents(node),locked_nodes) = empty_set
您在Window_Loaded方法中的位置取决于您尝试完成的行为。
希望这可以帮助其他人节省时间。
答案 2 :(得分:1)
我知道我来晚了一点,但我想告诉我已经找到了解决该问题的最干净的方法。
1。)创建一个自定义UserControl(如果使用的是任何控件)
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();
}
欢呼
答案 3 :(得分:0)
您可以设置控件MinHeight属性,以防止它变得更小。
答案 4 :(得分:0)
您可以将项目放入包含组成部分的行的网格中吗?
所有必须具有最小高度的物品都可以排成具有相似最小高度的行。
添加最小高度= Window.MinHeight。因此,窗口永远不会小于必要行的集合最小高度,因此应始终显示这些行。
答案 5 :(得分:0)
我想我记得在某处(我可能错了)读取堆叠面板的边框基于无限,并且无法处理这样的尺寸问题。
来自http://msdn.microsoft.com/en-us/library/ms754152.aspx
DockPanel与StackPanel
虽然DockPanel也可以“堆叠”子元素,但DockPanel和StackPanel在某些使用场景中不会产生类似的结果。例如,子元素的顺序可以影响它们在DockPanel中的大小,但不会影响StackPanel中的大小。这是因为 StackPanel在PositiveInfinity的堆叠方向上测量,而DockPanel仅测量可用的大小。
该帖子的一部分也讨论了嵌套面板。这可能是你需要的。
或者可以使用底行中状态的网格?