如何避免窗口小于WPF中UserControl的最小大小?

时间:2012-02-16 21:20:58

标签: .net wpf size resize

我有一个usercontrol(一个状态栏),它具有隐含的最小大小(不是通过属性设置的,我的意思是当它达到最小大小时,它不能被减少并且被裁剪)。

有没有办法让主窗口知道UserControl将被裁剪并且不允许它减小它的大小?有了像WPF这样的智能布局系统,它必须是一种知道它正在裁剪的方式。看下一张图片:

enter image description here

6 个答案:

答案 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仅测量可用的大小。

该帖子的一部分也讨论了嵌套面板。这可能是你需要的。

或者可以使用底行中状态的网格?