Reputation: 1055
I have four images in XAML:
<Image Visibility="Collapsed" Name="LeftArrow" Height="20" Width="20"></Image>
<Image Visibility="Collapsed" Name="RightArrow" Height="20" Width="20"></Image>
<Image Visibility="Collapsed" Name="TopArrow" Height="20" Width="20"></Image>
<Image Visibility="Collapsed" Name="BottomArrow" Height="20" Width="20"></Image>
And in my code-behind I've a switch case that makes all the other images collapsed when one of them is visible like this:
switch (ElementInfoCollection[pos].ArrowDirection)
{
case ArrowDirection.Left:
LeftArrow.Visibility = Visibility.Visible;
RightArrow.Visibility = Visibility.Collapsed;
TopArrow.Visibility = Visibility.Collapsed;
BottomArrow.Visibility = Visibility.Collapsed;
break;
case ArrowDirection.Right:
LeftArrow.Visibility = Visibility.Collapsed;
RightArrow.Visibility = Visibility.Visible;
TopArrow.Visibility = Visibility.Collapsed;
BottomArrow.Visibility = Visibility.Collapsed;
break;
case ArrowDirection.Top:
LeftArrow.Visibility = Visibility.Collapsed;
RightArrow.Visibility = Visibility.Collapsed;
TopArrow.Visibility = Visibility.Visible;
BottomArrow.Visibility = Visibility.Collapsed;
break;
case ArrowDirection.Bottom:
LeftArrow.Visibility = Visibility.Collapsed;
RightArrow.Visibility = Visibility.Collapsed;
TopArrow.Visibility = Visibility.Collapsed;
BottomArrow.Visibility = Visibility.Visible;
break;
default:
LeftArrow.Visibility = Visibility.Collapsed;
RightArrow.Visibility = Visibility.Collapsed;
TopArrow.Visibility = Visibility.Collapsed;
BottomArrow.Visibility = Visibility.Collapsed;
break;
}
Obviously this is quite a dumb way to do it so I would like to know how I can make the images collapsed when one of them is set to visible in the code-behind? This is what i've come up with so far:
<UserControl.Resources>
<Style x:Key="ArrowSwitch" TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger >
<Setter Property="Image.Visibility" Value="Collapsed"></Setter>
</DataTrigger>
<DataTrigger>
<Setter Property="Image.Visibility" Value="Visible"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
Upvotes: 0
Views: 2439
Reputation: 32667
If you want to use data binding, you can utilize a converter that maps the ArrowDirection to a Visibility value:
public class DirectionVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
ArrowDirection target;
ArrowDirection current;
try
{
current = (ArrowDirection)value;
}
catch (Exception)
{
return null;
}
if (Enum.TryParse(parameter.ToString(), out target))
{
if (current == target)
return Visibility.Visible;
else
return Visibility.Collapsed;
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
And use it in XAML like:
<Window.Resources>
<local:DirectionVisibilityConverter x:Key="VisibilityConverter"/>
</Window.Resources>
....
<Image Visibility="{Binding ArrowDirection, Converter={StaticResource VisibilityConverter}, ConverterParameter=Left}" .../>
where ArrowDirection
specifies the binding path for the ElementInfoCollection[pos].ArrowDirection
. If it implements INotifyPropertyChanged
, you just need to set this value to the correct direction and the visibilities will be updated.
Upvotes: 1
Reputation: 14432
This is the same code but much shorter:
switch (ElementInfoCollection[pos].ArrowDirection)
{
LeftArrow.Visibility = Visibility.Collapsed;
RightArrow.Visibility = Visibility.Collapsed;
TopArrow.Visibility = Visibility.Collapsed;
BottomArrow.Visibility = Visibility.Collapsed;
case ArrowDirection.Left: LeftArrow.Visibility = Visibility.Visible; break;
case ArrowDirection.Right: RightArrow.Visibility = Visibility.Visible; break;
case ArrowDirection.Top: TopArrow.Visibility = Visibility.Visible; break;
case ArrowDirection.Bottom: BottomArrow.Visibility = Visibility.Visible; break;
default: break;
}
Upvotes: 3