我的网格高度不一。随着高度缩小,这些元素中的一些将开始被切割,导致相当丑陋的外观。
我已尝试绑定网格的ActualHeight
并使用转换器使元素在硬编码高度消失。然而,这是相当混乱的,如果不是真的需要,我不想让它硬编码。
还有其他方法可以解决这个问题吗?例如,以某种方式获取元素的位置并将它们与网格ActualHeight
进行比较。
谢谢:)
更新,添加了xaml代码,下面是显示问题的图片。
对于第三行的网格,当网格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="▲" 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>
答案 0 :(得分:1)
对于可重用的解决方案,您需要两件事:
我将你的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的总和。然后每个控件都可以拥有它自己的转换器。