Вид не расширяется до масштабируемой границы
У меня есть граница внутри сетки, которая отображается в ChildWindow. Мне нужно увеличить границу, чтобы я применил к ней RenderTransform. Однако ChildWindow не расширилось, чтобы соответствовать масштабируемой границе. Похоже, что размер вычисляется до применения преобразования рендеринга. Это означает, что граница теперь обрезана, и я вижу только 1/4 ее.
Я попытался обернуть Border в ScrollViewer и ViewBox, ни один из которых не сработал.
<Grid>
...
<Border x:Name="Border"
Grid.Row="3"
Grid.ColumnSpan="2"
Background="White"
BorderBrush="Black"
BorderThickness="1"
CornerRadius="5"
VerticalAlignment="Top"
Height="{Binding NewLabelTemplate.Height}"
Width="{Binding NewLabelTemplate.Width}">
<Border.RenderTransform>
<ScaleTransform CenterX="0.5"
CenterY="0.5"
ScaleX="2"
ScaleY="2"/>
</Border.RenderTransform>
...
</Border>
...
</Grid>
Как я могу заставить ChildWindow использовать максимальный размер границы при расчете ее размера?
Я не могу применить масштаб к ChildWindow или напрямую использовать визуализированную высоту и ширину границы, поскольку в сетке есть другие элементы, которые я не хочу масштабировать.
1 ответ
На данный момент я могу придумать два возможных решения:
1. Рассчитайте масштабированные свойства для вашей границы, чтобы привязать к
<Grid>
<Grid.Resources>
<ScaledSizeProperties x:Key="BorderSizes"
ScaleFactor="2"
BorderThickness="1"
CornerRadius="5"
Height="{Binding NewLabelTemplate.Height}"
Width="{Binding NewLabelTemplate.Width}"/>
</Grid.Resources>
...
<Border x:Name="Border"
Grid.Row="3"
Grid.ColumnSpan="2"
Background="White"
BorderBrush="Black"
VerticalAlignment="Top"
BorderThickness="{Binding
Path=ScaledBorderThickness, Source={StaticResource BorderSizes}}"
CornerRadius="{Binding
Path=ScaledCornerRadius, Source={StaticResource BorderSizes}}"
Height="{Binding
Path=ScaledHeight, Source={StaticResource BorderSizes}}"
Width="{Binding
Path=ScaledWidth, Source={StaticResource BorderSizes}}">
...
</Border>
...
</Grid>
и код:
public class ScaledSizeProperties : DependencyObject
{
//add input DependencyProperties for:
//double ScaleFactor
//double BorderThickness
//double CornerRadius
//double Height
//double Width
//add output DependencyProperties for:
//double ScaledBorderThickness
//double ScaledCornerRadius
//double ScaledHeight
//double ScaledWidth
public double ScaleFactor
{
get { return (double) GetValue( ScaleFactorProperty ); }
set { SetValue( ScaleFactorProperty, value ); }
}
public static readonly DependencyProperty ScaleFactorProperty =
DependencyProperty.Register( "ScaleFactor", typeof( double ),
typeof( ScaledSizeProperties ),
new PropertyMetadata( 1, OnScaleFactorChanged ) );
private static void OnScaleFactorChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
//recalculate all size properties
}
public double Height
{
get ...
set ...
}
... DependencyProperty HeightProperty ... OnHeightChanged ...
private static void OnHeightChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
//recalculate ScaledHeight
}
}
2. Используйте LayoutTransformer вместо RenderTransform
LayoutTransformer, который является частью Инструментария, теперь (начиная с SL5) является официальной частью пакета базовой библиотеки Silverlight.
<Grid>
...
<LayoutTransformer
Grid.Row="3"
Grid.ColumnSpan="2"
VerticalAlignment="Top">
<LayoutTransformer.LayoutTransform>
<ScaleTransform CenterX="0.5"
CenterY="0.5"
ScaleX="2"
ScaleY="2"/>
</LayoutTransformer.LayoutTransform>
<Border x:Name="Border"
Background="White"
BorderBrush="Black"
BorderThickness="1"
CornerRadius="5"
Height="{Binding NewLabelTemplate.Height}"
Width="{Binding NewLabelTemplate.Width}">
...
</Border>
</LayoutTransformer>
...
</Grid>