을 설정하는 방법 그리드 열 MaxWidth 에 따라 창이나 화면 크기에 XAML

StackOverflow https://stackoverflow.com/questions/82323

  •  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.");
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top