2012-05-17 3 views
5

次のXAMLを使用すると、チェックボックスをオフにすると最下位行が非表示になります。あなたがグリッドスプリッターでサイズを変更するまで、すべてがうまくいきます。チェックボックスをオンまたはオフにしても何も行われません。コンバータが高さを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バインディングを指定する必要があります。そうしないと、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を使ってみましたか?

関連する問題