2012-05-17 2 views
5

다음 XAML에서는 확인란을 선택 취소 할 때 맨 아래 줄이 숨겨집니다. 그리드 스플리터로 크기를 조정할 때까지 모든 것이 잘됩니다. 그런 다음 확인란을 선택/선택 취소해도 아무런 변화가 없습니다. 변환기가 Height를 0으로 설정하면 행을 숨길 것으로 예상됩니다. 무슨 일이야? 스플리터를 움직여서 높이를 재설정하려면 어떻게해야합니까?스플리터를 사용한 후 그리드 행 높이를 재설정하는 방법은 무엇입니까?

<Grid> 
    <Grid.Resources> 
     <m:CheckedToLengthConverter x:Key="checkedToLengthConverter" /> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="3*" /> 
     <RowDefinition Height="{Binding Mode=OneWay, ElementName=ShowBottomCheckBox, Path=IsChecked, Converter={StaticResource checkedToLengthConverter}, ConverterParameter=2}" /> 
    </Grid.RowDefinitions> 
    <Border Background="Blue" /> 
    <CheckBox Name="ShowBottomCheckBox" IsChecked="True" /> 
    <GridSplitter HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Height="5" /> 
    <Border Background="Red" Grid.Row="1" /> 
</Grid> 

변환기 :

public class CheckedToLengthConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if ((bool)value) 
      return new GridLength(int.Parse(parameter.ToString()), GridUnitType.Star); 

     return new GridLength(0, GridUnitType.Pixel); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

답변

4

문제는 당신이 스플리터를 이동하면 첫 번째 행이 너무 영향을주지 않습니다 다시 * 마지막 행을 설정, 명시 적으로 폭 것입니다. 몇 가지 실험을 한 후 아래 코드를 생각해 냈습니다. TwoWay 바인딩을 지정해야합니다. 그렇지 않으면 작동하지 않습니다.

public class CheckedToLengthConverter : MarkupExtension, IValueConverter 
{ 
    public GridLength TrueValue { get; set; } 
    public GridLength FalseValue { get; set; } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return System.Convert.ToBoolean(value) ? TrueValue : FalseValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Binding.DoNothing; 
    } 

    #region Overrides of MarkupExtension 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 

    #endregion 
} 

<Grid> 
    <Grid.Resources> 
     <m:CheckedToLengthConverter TrueValue="2*" FalseValue="*" x:Key="c1" /> 
     <m:CheckedToLengthConverter TrueValue="3*" FalseValue="0" x:Key="c2" /> 
    </Grid.Resources> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="{Binding Mode=TwoWay, Path=IsChecked, 
         ElementName=ShowBottomCheckBox, 
         Converter={StaticResource c1}}"/> 
     <RowDefinition Height="auto"/> 
     <RowDefinition Height="{Binding Mode=TwoWay, Path=IsChecked, 
         ElementName=ShowBottomCheckBox, 
         Converter={StaticResource c2}}"/> 
    </Grid.RowDefinitions> 
    <Border Background="Blue" /> 
    <CheckBox Name="ShowBottomCheckBox" IsChecked="True" /> 
    <GridSplitter HorizontalAlignment="Stretch" 
        Grid.Row="1" VerticalAlignment="Bottom" Height="5" 
        ResizeBehavior="PreviousAndNext" /> 
    <Border Background="Red" Grid.Row="2" /> 
</Grid> 
+0

예를 들려 줄 수 있습니까? 나는 그것을 작동하게 만들 수 없다. – Manuel

+0

@Manuel, 나는 나를 위해 뭔가를 만들었습니다. – Phil

-1

이것은 코드가 아닌 UX의 문제입니다. 당신이하려는 것은 거의 의미가 없으며, 대신 Visual States를 사용해 보았습니까?

관련 문제