C# WPF-使元素在网格开始切割时消失

C# WPF-使元素在网格开始切割时消失,c#,wpf,xaml,grid,C#,Wpf,Xaml,Grid,我有一个高度不同的网格。随着高度的缩小,这些元素中的一些将开始被切割,导致外观相当难看 我尝试了绑定网格的实际高度,并使用转换器使元素在硬编码高度消失。然而,这是相当混乱的,我不想有它硬编码,如果它不是真的需要 有没有其他办法解决这个问题?例如,以某种方式获取元素的位置,并将其与网格实际高度进行比较 谢谢:) 更新,添加xaml代码,并在下面显示问题的图片 对于第三行的网格,我添加了一个转换器,当网格ActualHeight低于硬编码值时,该转换器返回Visibility.Hidden

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

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

有没有其他办法解决这个问题?例如,以某种方式获取元素的位置,并将其与网格
实际高度进行比较

谢谢:)

更新,添加xaml代码,并在下面显示问题的图片

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

    <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>

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

  • StockGrid的所有行都设置为自动高度时的实际高度(允许带*高度的虚拟行)
  • 用作StockGrid容器的网格的高度。高度设置为*(=完全不设置)
  • 我把你的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>
    
    
    
    多值转换器

    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();
        }
    }
    
    公共类HeightToVisibilityConverter:IMultiValueConverter
    {
    公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
    {
    双容器高度=(双)值[0];
    double StockGridHeight=(双)值[1];
    if(容器高度<料格高度)
    返回可见性。隐藏;
    其他的
    返回可见性。可见;
    }
    公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
    {
    抛出新的NotImplementedException();
    }
    }
    

    请注意,您可以更进一步。使用每行控件的实际权重之和,而不是StockGrid的。每个控件都可以有自己的转换器。

    您可以显示此问题的代码吗???添加的图片和代码您可以使用百分比而不是硬编码值,并相应地设计UI。使用ViewBox。将文本框包装在ViewBox中,并将其设置为仅收缩。然后去掉行上的自动高度,使用不同的星形设置:1*、2*、4*,等等。这将使其基于百分比,比自动缩放效果更好。在UI中创建区域。根据窗口的高度切换这些区域的可见性。使用相应的高度百分比/硬代码值。非常感谢!!这很好,完全解决了我的问题