【问题标题】:What size should be returned from MeasureOverrideMeasureOverride 应该返回什么尺寸
【发布时间】:2013-12-27 07:54:16
【问题描述】:

控制如何说:我会占用父母给我的所有空间?

例如,我的控件在 ScrollVewer 中。它用大小(无限,无限)衡量我的控制。我的控件显示小图表。图表仍然看起来不错时的最小尺寸是 (300, 300)。最大尺寸不受限制。我的控件应该从 MeasureOverride() 返回什么大小? (0,0) 还是 (300, 300)?

当 availableSize 是准确的尺寸时,MeasureOverride 方法应该返回什么尺寸,例如 (1234, 1235)?

这个问题与 WPF 和 Windows 8 XAML 应用程序都相关。

【问题讨论】:

    标签: wpf windows-store-apps


    【解决方案1】:

    正确的解决方案实际上是在MeasureOverride中返回0大小。或者任何需要的最小尺寸。

    然后将使用 ScrollViewer 的可用大小调用 ArrangeOverride。

    你可以试试:

    <Window x:Class="TestMeasure.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:TestMeasure"
            Title="MainWindow" Height="350" Width="525">
        <ScrollViewer>
        <local:MyTextBox Text="Hi"/>
      </ScrollViewer>
    </Window>
    

    using System.Windows;
    using System.Windows.Controls;
    
    namespace TestMeasure {
      class MyTextBox: TextBox {
        protected override System.Windows.Size MeasureOverride(System.Windows.Size constraint) {
          Size baseSize = base.MeasureOverride(constraint);
          return baseSize;
        }
    
        protected override System.Windows.Size ArrangeOverride(System.Windows.Size arrangeBounds) {
          Size baseSize = base.ArrangeOverride(arrangeBounds);
          return baseSize;
        }
      }
    }
    

    请注意,TextBox 实际上确实在 MeasureOverride 中返回了一个大小,但 ScrollViewer 仍然在 Arrange 中传递了它自己的大小。

    【讨论】:

      【解决方案2】:

      MeasureOverride 的参数是avaibleSize。顾名思义,这是控件可以使用/填充的最大尺寸。控件现在应该返回稍后将使用的实际大小。返回的大小可以是完整的给定大小或更小(例如,控件总是绘制正方形并且需要更少的空间)。

      使用 ScrollViewer 的游戏有点不同。 ScrollViewer 假装拥有无限空间并将 availableSize 设置为无限。现在由控制来决定它有多大或它喜欢多大。但是控件必须知道如果窗口太小它会滚动。顺便说一句,返回 0/0 意味着您的控件不需要任何空间。

      在您的情况下,滚动图表可能不是最好的方法。 lain 建议的方式是解决该问题的一种方法:将窗口的剩余空间留给您的控件,并让您的控件在这些边界内缩放。

      【讨论】:

      • 我的控件可能被其他人使用
      • 我不确定我是否理解正确。当然,您的控件必须处理availbleSize 是无限的。正如其他人已经提到的,只是返回一个有意义的大小(至少在某种程度上)。但本质上它是对您的控制的轻微滥用。在所有其他情况下,只需返回您获得的大小并填充该空间。
      【解决方案3】:

      也许您可以将图表显示为至少 300x300 的大小,如果您有更多空间,可以将其放大。您可以使用 Scrollviewer 的 ActualWidth 和 ActualHeight 属性来确保这一点。

      【讨论】:

        【解决方案4】:

        您通常使用DockPanel 并像这样设置LastChildFill=True 来执行此操作:

        <DockPanel LastChildFill="True">
            <ScrollViewer>
               <Button MinWidth="300" MinHeight="300"></Button>
            </ScrollViewer>
        </DockPanel>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-19
          • 1970-01-01
          • 2015-03-22
          • 2019-01-14
          • 1970-01-01
          • 1970-01-01
          • 2014-10-09
          相关资源
          最近更新 更多