2011-11-22 52 views
0

是否可以將控件的ActualWidthWidth屬性綁定到另一個控件的Visibility並區分值(如< 200)?在我的意見中,它只能使用轉換器,因爲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(); 
} 
+0

那你試試?爲什麼它不工作? – SLaks

+0

向我們展示您嘗試的代碼 – mydogisbox

+0

您是否試圖根據另一個控件寬度更改可見性? –

回答

1

ActualWidth是FrameworkElement的類公開一個只讀屬性 -

public double ActualWidth { get; } 

只有得到屬性,因此您無法將其設置爲代碼中的其他值。您可以綁定到您的控件的寬度,而不是使其工作。

編輯

這個工作對我來說,可能這就是你想要的東西 -

轉換

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

我打算說,但是在重讀了我認爲他正在尋找的問題(actualwidth> somevalue) - > Visible; –

+0

在你的xaml中,我猜錯誤地將矩形「矩形」可見性綁定到自身的ActualWidth(112),而不是綁定到矩形「移動器」的ActualWidth .. :) –

0

如果你試圖改變基於另一個控制ActualWidth控制的Visibility,你要麼需要使用IValueConverter或者你自己的類型的MarkupExtension(從BindingBindingBase繼承)。

轉換器選項:

[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選項:

閱讀this博客文章以獲取如何實現這更好的感覺...

2

很可能不工作,因爲你是將您的Rectangle的Visibility綁定到同一個矩形的ActualWidth,並且不可見的矩形的寬度始終爲0,因此永遠不會顯示。

下面是一些例子。一個結合其他矩形的ActualWidth,另結合到你的Slider的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}}"/> 

而且據我所知,有基礎的值關閉的,如果事情沒有簡單的方法大於或小於一個值。隱蔽者是你最好的選擇。

+0

我猜他的意圖是綁定到其他控件,但沒有正確輸入它,因爲什麼是使0寬度控制隱藏的點?它已經不可見! –

0

實際上,你可以在一個參數值,所以如果你需要,你可以重新使用轉換器:

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> 
相關問題