2012-05-17 9 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

समस्या यह है कि एक बार आप विभाजक के लिए कदम पहली पंक्ति तो अंतिम पंक्ति वापस * के लिए सेटिंग कोई असर नहीं होगा एक स्पष्ट चौड़ाई होगा, है। कुछ प्रयोग के बाद मैं नीचे दिए गए कोड के साथ आया था। ध्यान दें कि आपको दोवे बाध्यकारी निर्दिष्ट करने की आवश्यकता है या यह काम नहीं करेगा।

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

@ मैनुअल, मैंने कुछ ऐसा बनाया है जो मेरे लिए काम करता है। – Phil

-1

यह यूएक्स समस्या है, कोड नहीं। आप जो करने की कोशिश कर रहे हैं, वह थोड़ा सा समझ में आता है, क्या आपने इसके बजाय विजुअल स्टेट्स का उपयोग करने की कोशिश की है?

संबंधित मुद्दे