2012-05-17 40 views
5

Với XAML sau, hàng dưới cùng sẽ ẩn khi bạn bỏ chọn hộp kiểm. Tất cả mọi thứ là tốt cho đến khi bạn thay đổi kích thước nó với gridsplitter. Sau đó kiểm tra/bỏ chọn hộp kiểm không làm gì cả. Cho rằng bộ chuyển đổi thiết lập chiều cao là 0 tôi dự kiến ​​hàng ẩn. Chuyện gì vậy? Làm thế nào tôi có thể thiết lập lại chiều cao sau khi di chuyển bộ chia?Làm thế nào để đặt lại chiều cao hàng lưới sau khi sử dụng bộ tách?

<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> 

Chuyển đổi:

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(); 
    } 
} 

Trả lời

4

Vấn đề là một khi bạn di chuyển con splitter hàng đầu tiên sẽ có một chiều rộng rõ ràng, vì vậy thiết lập hàng cuối cùng trở lại * sẽ không có hiệu lực. Sau một số thử nghiệm, tôi đã đưa ra mã dưới đây. Lưu ý rằng bạn cần phải chỉ định một ràng buộc TwoWay hoặc nó sẽ không hoạt động.

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

Bạn có thể đưa ra ví dụ không? Tôi không thể làm cho nó hoạt động được. – Manuel

+0

@Manuel, tôi đã tạo ra thứ gì đó phù hợp với mình. – Phil

-1

Đây là các vấn đề của UX chứ không phải mã. Những gì bạn đang cố gắng làm ít ý nghĩa, bạn đã thử sử dụng Visual States chứ?

Các vấn đề liên quan