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="▲" Visibility="{Binding Tag.IsPosValueChange,Converter={StaticResource BoolToVisibility}}"
Foreground="White" Margin="10,0,0,0" FontSize="16"/>
<TextBlock Grid.Column="1" Text="▼" 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中创建区域。根据窗口的高度切换这些区域的可见性。使用相应的高度百分比/硬代码值。非常感谢!!这很好,完全解决了我的问题