Привязка различия на основе фактической ширины к видимости - PullRequest
0 голосов
/ 22 ноября 2011

Можно ли связать свойство ActualWidth или Width элемента управления с Visibility другого элемента управления с разницей в значении (например, <200)? По моему мнению, это возможно только с конвертером, потому что <code>DataTrigger не может работать с > или <.

Так что я попробовал это с конвертером, но он не работал. Я не уверен, какой BindingMode необходим и какой конвертер мне нужен для такого решения.

Код xaml:

<StackPanel>
    <Slider x:Name="slider" Height="36" Width="220" Maximum="500"/>
    <Rectangle x:Name="mover"  Height="12" Stroke="Black" Width="{Binding Value, ElementName=slider}"/>
    <Rectangle x:Name="rectangle" Fill="#FFFF9E0E" Height="34" Width="112" Visibility="{Binding ActualWidth, Converter={StaticResource umkehr}, ElementName=rectangle, Mode=OneWay}"/>
</StackPanel>

и идея для конвертера:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
   if (value != null) {
       var val = System.Convert.ToDouble(value);
        if (val > 100)
            return Visibility.Visible;
        return Visibility.Collapsed;
    }
        return Visibility.Collapsed;
}

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

Ответы [ 4 ]

2 голосов
/ 22 ноября 2011

Вероятно, это не работает, потому что вы привязываете свой Rectangle Visibility к тому же прямоугольнику ActualWidth, а невидимый прямоугольник всегда будет иметь ширину 0, поэтому никогда не будет виден.

ВотНекоторые примеры.Один связывается с ActualWidth другого прямоугольника, а другой - с Value

<Rectangle x:Name="rectangle" 
           Visibility="{Binding ActualWidth, ElementName=mover, 
               Converter={StaticResource umkehr}}"/>

или

<Rectangle x:Name="rectangle" 
           Visibility="{Binding Value, ElementName=slider, 
               Converter={StaticResource umkehr}}"/>

вашего Слайдера. И, насколько я знаю, простого пути нетна основе значения, если что-то больше или меньше, чем значение.Coverters ваш лучший вариант.

1 голос
/ 22 ноября 2011

ActualWidth - это свойство только для чтения, предоставляемое классом FrameworkElement -

public double ActualWidth { get; }

Это свойство get only, поэтому вы не можете установить для него другое значение из кода.Вместо этого вы можете привязать к Width вашего элемента управления, чтобы он работал.

EDIT

Это работает для меня, может быть, это то, что вы хотите -

Конвертер

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value is double)
    {
       return ((double)value > 100) ? Visibility.Visible : Visibility.Collapsed;
    }
    return Visibility.Collapsed;
}

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

XAML

<StackPanel>
   <Slider x:Name="slider" Height="36" Width="220" Maximum="500"/>
   <Rectangle x:Name="mover"  Height="12" Stroke="Black" Width="{Binding Value, ElementName=slider}"/>
    <Rectangle x:Name="rectangle" Fill="#FFFF9E0E" Height="34" Width="112" Visibility="{Binding ActualWidth, Converter={StaticResource MyConverter}, ElementName=mover, Mode=OneWay}"/>
</StackPanel>
0 голосов
/ 31 октября 2013

На самом деле вы можете иметь значение в параметре , поэтому вы можете повторно использовать конвертер, если вам нужно:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            double cutoff = 0.0;

            if(parameter is double)
            {
                cutoff = (double)parameter;
            }

            if (parameter is string)
            {
                Double.TryParse(parameter.ToString(), out cutoff); 
            }

            if (value is double)
            {
                return ((double)value > cutoff) ? Visibility.Visible : Visibility.Collapsed;
            }
            return Visibility.Collapsed;
        }

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

И XAML:

<StackPanel>
    <Slider x:Name="slider" Height="36" Width="220" Maximum="500"/>
    <Rectangle x:Name="mover"  Height="12" Stroke="Black" Width="{Binding Value, ElementName=slider}"/>
     <Rectangle x:Name="rectangle" Fill="#FFFF9E0E" Height="34" Width="112" 
                Visibility="{Binding ActualWidth, Converter={StaticResource ActualWidthToVisibilityConverter},                                                                                               
                ElementName=mover, Mode=OneWay, ConverterParameter=100}"/>
</StackPanel>
0 голосов
/ 22 ноября 2011

Если вы пытаетесь изменить Visibility элемента управления на основе ActualWidth другого элемента управления, вам нужно будет либо использовать IValueConverter или ваш собственный тип MarkupExtension (наследуется от Binding или BindingBase).

*Опция конвертера 1020 *:
[ValueConversion(typeof(Double), typeof(Visibility))]
[ValueConversion(typeof(Double?), typeof(Visibility))]
public class MinimumLengthToVisibilityConverter : IValueConverter
{
    public Double MinLength { get; set; }

    public override Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
    {
        if ((value == null) || !(value is Double))
        {
            return DependencyProperty.UnsetValue;
        }

        return (((Double)value) > MinLength) ? Visibility.Visible : Visibility.Collapsed;
    }

    public override Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }
}

Опция MarkupExtension:

Читать это сообщение в блоге, чтобы лучше понять, как его реализовать ...

...