Search code examples
wpftriggersdatatrigger

How to write WPF DataTrigger within Border Style and how to Find Element in Setter?


I need a WPF DataTrigger for the Mouse Hover functionality of a Border. The Border Contains a Button, initially its Visibility is Collapsed. The Button should be Visible only on Mouse Hover otherwise Collapsed.

<Border Width="100" Height="30" HorizontalAlignment="Center" VerticalAlignment="Top" Background="#FFF2FFC6" Margin="0,20,0,0">
    <Button x:Name="btn" Content="iApp" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" Visibility="Collapsed" />
    <Border.Style>
        <Style TargetType="Border">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True">
                    <Setter TargetName="btn" Property="Visibility" Value="Visible"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

Note: I need only DataTrigger. Don't suggest Event Trigger.

Here I Can't able to find the TargetName, it produces the Build Error "Error 1 The name "btn" is not recognized"


Solution

    1. TragetName cannot be used in Style.Triggers. It should be used in ControlTemplete.Triggers.
    2. You can write code like this(Not test).

    Add the namespace in you xaml

         xmlns:converter="clr-namespace:yours coverter's namespace"
    

    Add the converter in your resources

         <UserControl.Resources>
               <converter:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
         </UserControl.Resources>
    

    This is your border:

         <Border x:Name="m_Border" Margin="0,20,0,0">
         <Button x:Name="btn" Content="iApp"  Visibility="{Binding  IsMouseOver,ElementName=m_Border,Converter="{StaticResource BooleanToVisibilityConverter},ConverterParameter=Normal}"}" />
        </Border> 
    
    1. Using this converter

        public enum BooleanToVisibilityConverterType
        {
              /// <summary>
              /// Normal
              /// </summary>
              Normal = 1,
      
              /// <summary>
              /// Reverse
              /// </summary>
              Reverse = 2
         }
      
        public class BooleanToVisibilityConverter : IValueConverter
        {
              public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
              {
                   var targertValue = false;
      
               if (value == null)
               {
                   throw new Exception("BooleanToVisibilityConverter - Convert Error");
               }
               else if (!Boolean.TryParse(value.ToString(), out targertValue))
               {
                   throw new Exception("BooleanToVisibilityConverter - Convert Error");
               }
               else
               {
                   var parameterValue = BooleanToVisibilityConverterType.Normal;
      
                   if (parameter != null)
                   {
                       Enum.TryParse<BooleanToVisibilityConverterType>(parameter.ToString(), out parameterValue);
                   }
      
                   if (parameterValue == BooleanToVisibilityConverterType.Reverse)
                   {
                  return targertValue ? Visibility.Collapsed : Visibility.Visible;
                   }
                   else
                   {
                       return targertValue ? Visibility.Visible : Visibility.Collapsed;                    
                   }
               }
           }
      
      public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
      {
          var targetValue = Visibility.Collapsed;
      
          if (value == null)
          {
              throw new Exception("BooleanToVisibilityConverter - ConvertBack Error");
          }
          else if (!Enum.TryParse<Visibility>(value.ToString(), out targetValue))
          {
              throw new Exception("BooleanToVisibilityConverter - ConvertBack Error");
          }
          else
          {
              var parameterValue = BooleanToVisibilityConverterType.Normal;
      
              if (parameter != null)
              {
                  Enum.TryParse<BooleanToVisibilityConverterType>(parameter.ToString(), out parameterValue);
              }
      
              if (parameterValue == BooleanToVisibilityConverterType.Reverse)
              {
                  return targetValue == Visibility.Visible ? false : true;
              }
              else
              {
                  return targetValue == Visibility.Visible ? true : false;
              }
          }
      }