WPF - 当网格开始削减它们时,使元素消失

时间:2016-07-03 03:02:13

标签: c# wpf xaml grid

我的网格高度不一。随着高度缩小,这些元素中的一些将开始被切割,导致相当丑陋的外观。

我已尝试绑定网格的ActualHeight并使用转换器使元素在硬编码高度消失。然而,这是相当混乱的,如果不是真的需要,我不想让它硬编码。

还有其他方法可以解决这个问题吗?例如,以某种方式获取元素的位置并将它们与网格ActualHeight进行比较。

谢谢:)

更新,添加了xaml代码,下面是显示问题的图片。

Here, the textbox at row 2 gets cut-of

对于第三行的网格,当网格Visibility.Hidden低于硬编码值时,我添加了一个返回ActualHeight的转换器。

    <DataTemplate x:Key="leafContentTemplate" >
    <Border BorderThickness="5" Background="DimGray">
        <Grid Background="{Binding Tag.PriceChangeDirection, Converter={StaticResource ColorConverter}}" Name="StockGrid" >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <dxe:SparklineEdit Grid.Row="0" Grid.ColumnSpan="2" Grid.RowSpan="100" EditValue="{Binding Tag.Prices}"   Margin="0 5 0 0"  >
                <dxe:SparklineEdit.StyleSettings >
                    <dxe:AreaSparklineStyleSettings AreaOpacity="0.3" Brush="DarkBlue" />
                </dxe:SparklineEdit.StyleSettings>
                <dxe:SparklineEdit.PointArgumentRange>
                    <dxe:Range Auto="True"/>
                </dxe:SparklineEdit.PointArgumentRange>

            </dxe:SparklineEdit >

            <TextBlock Grid.Row="0" Text="{Binding Tag.Name}" FontSize="16"
                       Foreground="Black"/>
            <TextBlock Grid.Row="1" Text="{Binding Tag.Ticker}" 
                       Foreground="Black" FontSize="24"/>
            <TextBlock  Grid.Row="2" Text="{Binding Tag.Volume, StringFormat=Vol.: {0}}" FontSize="16"
                       Foreground="Black"  />
            <TextBlock Grid.Row="3"  Text="{Binding Tag.Trades, StringFormat=Trades: {0}}" FontSize="16"
                       Foreground="Black"  Visibility="{Binding ElementName=StockGrid, Path=ActualHeight, Converter={StaticResource HeightToVisibilityConverter}}" />

            <StackPanel Grid.Column="1" Grid.RowSpan="100"  Orientation="Vertical" Margin="0,0,10,10" VerticalAlignment="Bottom" HorizontalAlignment="Right" >
                <TextBlock  HorizontalAlignment="Right" Text="{Binding Tag.Price}" 
                       Foreground="White" FontSize="30"/>
                <Grid  HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,0,0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <TextBlock Grid.Column="0"  
                       Text="{Binding Tag.PercentPriceChange}" Foreground="White" FontSize="16"/>

                    <TextBlock  Grid.Column="1" Text="&#x25B2;" Visibility="{Binding Tag.IsPosValueChange,Converter={StaticResource BoolToVisibility}}" 
                            Foreground="White" Margin="10,0,0,0"  FontSize="16"/>
                    <TextBlock  Grid.Column="1" Text="&#x25BC;" Visibility="{Binding Tag.IsPosValueChange,Converter={StaticResource InverseBoolToVisibility}}" 
                            Foreground="White" Margin="10,0,0,0" FontSize="16" />
                </Grid>
            </StackPanel>
        </Grid>
    </Border>
</DataTemplate>

1 个答案:

答案 0 :(得分:1)

对于可重用的解决方案,您需要两件事:

  1. StockGrid的实际高度,其所有行设置为自动高度(允许*高度的虚拟行)。
  2. 充当StockGrid容器的网格高度。高度设置为*(=等于未设置)。
  3. 我将你的XAML剥离到了骨头

    <Border BorderThickness="5" Background="DimGray">
        <Grid x:Name="Container">
            <Grid x:Name="StockGrid" >
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
    
                <TextBlock Grid.Row="0" Text="Projector Forsikring" FontSize="16"
                           Foreground="Black"/>
                <TextBlock Grid.Row="1" Text="OSL.PROT" 
                           Foreground="Black" FontSize="24"/>
                <TextBlock  Grid.Row="2" Text="Vol.10000" FontSize="16"
                           Foreground="Black"  />
                <TextBlock Grid.Row="3"  Text="ProTrade" FontSize="16"
                           Foreground="Black">
                    <TextBlock.Visibility>
                        <MultiBinding Converter="{StaticResource HeightToVisibilityConverter}">
                            <Binding ElementName="Container" Path="ActualHeight"/>
                            <Binding ElementName="StockGrid" Path="ActualHeight"/>
                        </MultiBinding>
                    </TextBlock.Visibility>
                </TextBlock>
            </Grid>
        </Grid>
    </Border>
    

    IMultiValueConverter

    public class HeightToVisibilityConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            double ContainerHeight = (double)values[0];
            double StockGridHeight = (double)values[1];
    
            if (ContainerHeight < StockGridHeight)
                return Visibility.Hidden;
            else
                return Visibility.Visible;
       }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    请注意,您可以更进一步。使用每行中控件的ActualHeights的总和,而不是StockGrid的总和。然后每个控件都可以拥有它自己的转换器。