【问题标题】:If XAML Grid Row/Column is "*" - How to get the usable area programmatically?如果 XAML 网格行/列是“*” - 如何以编程方式获取可用区域?
【发布时间】:2015-07-07 23:37:33
【问题描述】:

下面我有一些相当原始的代码(仅供测试,试图证明这一点)。我有一个网格行和一个网格列,它们的宽度和高度分别定义为“*”,以便它们用完其他行/列未使用的所有可用空间。相当标准,至少我是这么认为的。

<Grid x:Name="PageContent" Background="{Binding PageColor}">
    <Grid.RowDefinitions>
        <RowDefinition Height="81" />
        <RowDefinition Height="*" />
        <RowDefinition Height="92" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <Button x:Name="backButton" Grid.Row="0" Grid.Column="0" Click="GoBack" IsEnabled="{Binding Frame.CanGoBack, ElementName=pageRoot}" Style="{StaticResource TopBackButtonStyle}" />
    <Button x:Name="searchButton" Grid.Row="0" Grid.Column="2" Click="GoSearch" Style="{StaticResource TopSearchButtonStyle}" HorizontalAlignment="Right"/>
    <Button x:Name="settingsButton" Grid.Row="0" Grid.Column="3" Click="GoSettings" Style="{StaticResource TopSettingsButtonStyle}" HorizontalAlignment="Right"/>

    <ScrollViewer Grid.Row="1" Grid.ColumnSpan="4" Name="MainScrollViewer" ZoomMode="Disabled" IsTabStop="False" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Padding="0,0,0,20" >
        <Image x:Name="PDFRenderedImage" AutomationProperties.Name="placeholder image" Source="Assets/placeholder-sdk.png" Stretch="None" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="10,10,10,10"/>
    </ScrollViewer>

现在,我正在尝试使用 Microsoft 为示例定义的一些更便宜的 PDF 显示例程。其中之一是使用带有 PdfPageRenderOptions 的 RenderToStreamAsync。

我想做的一件事是尝试缩放 PDF 生成的图像,以便无论如何页面都适合屏幕。但是,至少使用 PdfPageRenderOptions 这样做意味着我需要提前知道宽度/高度。

那么,如何以编程方式获取在使用该元素之前定义为“*”的原始/列中的 UIElement 的宽度和高度(意思是,即使该大小,我如何获得可用区域大小尚未使用)。

有没有人发现更好的方法?

【问题讨论】:

    标签: xaml visual-studio-2013 windows-runtime grid winrt-xaml


    【解决方案1】:

    如果您的区域未被使用,您可以随时设置 MinHieght 和 MinWidth。这样它将默认为 MinHeight 和 MinWidth 并且仍然能够相应地扩展/收缩。

    希望这会有所帮助:)

    【讨论】:

      【解决方案2】:

      为您的 ScrollViewer 添加一个名称,然后在后面的代码中获取它的宽度/高度属性。

      在 Page.xaml 中

      <ScrollViewer x:Name="MyScrollViewer">
          <Image.../>
      </ScrollViewer>
      

      在 Page.xaml.cs 中

      public void LoadPDF()
      {
          var height = MyScrollViewer.Height;
          //do something with it
      }
      

      【讨论】:

      • 本例中的滚动查看器显示高度为 NaN,ActualHeight 为 0。所以这两个看起来也像个半身像。
      【解决方案3】:

      UIElement.ActualHeigh 和 ActualWeight 是我想要的。但仍不完全。

      我最终做的事情很乱,我不喜欢它。我所做的是将 PDF 渲染并显示为图像。然后读取 Actualheight 和 ActualWidth 并使用那些(可见的)尺寸再次重新渲染整个事物。

      它有效,它看起来很重,但它确实有效。

      【讨论】:

      • 其实不行,还是不行。这给出了仅用于原型制作的图像的实际高度和宽度。
      【解决方案4】:

      只需为您的特定行/列提供x:Name,而不是分别查询它们的ActualHeightActualWidth。 (如果您真的想确保在渲染阶段之后发生这种情况,请通过 Dispatcher.Invoke 使用 low 优先级设置执行所有这些操作。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-26
        • 2012-05-22
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        相关资源
        最近更新 更多