을 설정하는 방법 그리드 열 MaxWidth 에 따라 창이나 화면 크기에 XAML
-
01-07-2019 - |
문제
나는 3 열의 격자에는 창 GridSplitter 에 첫 번째 열에 있습니다.내가 원하는 설정 MaxWidth 의 첫 번째 열의 세 번째 창 부모 또는 페이지 Width
(나 ActualWidth
고)내가 선호하는 것이 이렇게하려면에 XAML 가능한 경우.
이것은 일부 샘플 XAML 놀 XamlPad(또는 이와 유사한 것)무엇인지 보여하고 있어요.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="Column1" Width="200"/>
<ColumnDefinition x:Name="Column2" MinWidth="50" />
<ColumnDefinition x:Name="Column3" Width="{ Binding ElementName=Column1, Path=Width }"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Background="Green" />
<GridSplitter Grid.Column="0" Width="5" />
<Label Grid.Column="1" Background="Yellow" />
<Label Grid.Column="2" Background="Red" />
</Grid>
</Page>
당신이 볼 수있는,오른쪽 열의 폭은 폭의 첫 번째 열,그래서 당신이 왼쪽 슬라이드 사용하여 열 쪼개는 도구,오른쪽 열가 동일합니다:) 는 경우 슬라이드 하려면 왼쪽,오른쪽 결국은 슬라이드 절반 이상이 페이지/창고 오른쪽 창의 밀리 열 2and3.
나는 원하는 이를 방지하기 위해 설정하여 MaxWidth 의 열 1 세 번째 창의 너비(또는).내가 이것을 할 수 있는 코드에서 뒤에 아주 쉽게,하지만 작업을 수행할 수 있는 방법을"XAML 만"?
편집: 데이비드 슈미트가 사용하는 것이 좋 SharedSizeGroup 대신하는 바인딩을 소개하고,우수한 제안을 줍니다.나의 샘플 코드는 다음과 같이 보일 것입니다 그런 다음:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<Grid IsSharedSizeScope="True">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="Column1" SharedSizeGroup="ColWidth" Width="40"/>
<ColumnDefinition x:Name="Column2" MinWidth="50" Width="*" />
<ColumnDefinition x:Name="Column3" SharedSizeGroup="ColWidth"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Background="Green" />
<GridSplitter Grid.Column="0" Width="5" />
<Label Grid.Column="1" Background="Yellow" />
<Label Grid.Column="2" Background="Red" />
</Grid>
</Page>
해결책
나는 생각 XAML-유일한 방법은 약간 우회하지만,여기에 그것을 할 수있는 방법입니다.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
<!-- This contains our real grid, and a reference grid for binding the layout-->
<Grid x:Name="Container">
<!-- hidden because it's behind the grid below -->
<Grid x:Name="LayoutReference">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!-- We need the border, because the column doesn't have an ActualWidth -->
<Border x:Name="ReferenceBorder"
Background="Black" />
<Border Background="White" Grid.Column="1" />
<Border Background="Black" Grid.Column="2" />
</Grid>
<!-- I made this transparent, so we can see the reference -->
<Grid Opacity="0.9">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="Column1"
MaxWidth="{Binding ElementName=ReferenceBorder,Path=ActualWidth}"/>
<ColumnDefinition x:Name="Column2"
MinWidth="50" />
<ColumnDefinition x:Name="Column3"
Width="{ Binding ElementName=Column1, Path=Width }"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Background="Green"/>
<GridSplitter Grid.Column="0" Width="5" />
<Label Grid.Column="1" Background="Yellow" />
<Label Grid.Column="2" Background="Red" />
</Grid>
</Grid>
</Page>
다른 팁
너무 게으른 실제로 그것을 쓰기까지 자신을,하지만 당신이 사용할 수 있어야의 수학적 변환기고 바인딩 부모 windows 폭(하나로 이름 또는 RelativeSource 조상 검색).
//I know I borrowed this from someone, sorry I forgot to add a comment from whom
public class ScaledValueConverter : IValueConverter
{
public Object Convert(Object value, Type targetType, Object parameter, System.Globalization.CultureInfo culture)
{
Double scalingFactor = 0;
if (parameter != null)
{
Double.TryParse((String)(parameter), out scalingFactor);
}
if (scalingFactor == 0.0d)
{
return Double.NaN;
}
return (Double)value * scalingFactor;
}
public Object ConvertBack(Object value, Type targetType, Object parameter, System.Globalization.CultureInfo culture)
{
throw new Exception("The method or operation is not implemented.");
}
}
제휴하지 않습니다 StackOverflow