首页 > 技术文章 > WPF系统级Converter

dongweian 2022-06-26 13:51 原文

一、BooleanToVisibilityConverter类

表示将布尔值与 Visibility 枚举值相互转换的转换器。使用 BooleanToVisibilityConverter 类将布尔值转换为值和从 Visibility 值转换。 该方法 Convert 返回 Visibility.Visible 传入时间 trueVisibility.Collapsed 传入时间 false 。 请注意,该值 Visibility.Collapsed 隐藏控件,并且不会在布局中为其保留空间。 调用 ConvertBack 该方法并指定对对象的引用时,它将返回 true 该对象( Visible否则返回 false)。

具体使用如下所示:

    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"></BooleanToVisibilityConverter>
    </Window.Resources>
    <Grid Margin="20" Height="Auto" Background="Bisque">
        <CheckBox Content="显示" x:Name="DisplayCheckBox"></CheckBox>
        <Border Width="200" Height="80" Background="Coral" HorizontalAlignment="Left"
                Visibility="{Binding ElementName=DisplayCheckBox, Path=IsChecked, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}"></Border>
    </Grid>

二、其他系统Converter类

1、AlternationConverter

通过将整数作为索引应用于对象列表,进行整数和对象的相互转换。可以使用该 AlternationConverter 属性将属性绑定到交替值。 例如,如果希望项 ListBox 具有交替的蓝色和浅蓝色背景,请执行以下操作:

以下示例创建一个并使用两AlternationConverterListBox对象替换Background项和FontStyle项。

  <Grid>
          <Grid.Resources>
              <x:Array x:Key="DataList" Type="{x:Type system:String}">
                  <system:String>First</system:String>
                  <system:String>Second</system:String>
                  <system:String>Third</system:String>
                </x:Array>
                <AlternationConverter x:Key="BackgroundConverter">
                    <SolidColorBrush>Red</SolidColorBrush>
                    <SolidColorBrush>Blue</SolidColorBrush>
                    <SolidColorBrush>Green</SolidColorBrush>
                </AlternationConverter>
                <AlternationConverter x:Key="FontStyleConverter">
                    <FontStyle>Normal</FontStyle>
                    <FontStyle>Italic</FontStyle>
                </AlternationConverter>
                <Style x:Key="AlternatingWithBinding" TargetType="ListBoxItem">
                  <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Mode=Self},
                      Path=(ItemsControl.AlternationIndex), 
                      Converter={StaticResource BackgroundConverter}}"></Setter>
                    <Setter Property="FontStyle" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=(ItemsControl.AlternationIndex),
                        Converter={StaticResource FontStyleConverter}}"></Setter>
              </Style>
          </Grid.Resources>
          <ListBox ItemsSource="{StaticResource DataList}"
                   AlternationCount="100" 
                   ItemContainerStyle="{StaticResource AlternatingWithBinding}"></ListBox>
      </Grid>

image-20220626134026668

2、MenuScrollingVisibilityConverter

表示用于处理滚动菜单中重复按钮的可见性的数据绑定转换器。确定 MenuScrollingVisibilityConverter 当菜单具有太多项目无法同时在屏幕上时,菜单是否应显示重复按钮。 将转换器与具有四个 MultiBinding 绑定的转换器一起使用。 这四个绑定应是父ScrollViewer项的属性:如果菜单项按垂直方式组织 (,这是菜单) 、绑定到ComputedVerticalScrollBarVisibilityVerticalOffsetExtentHeightViewportHeight的默认值。 如果菜单项是水平组织的,则绑定到 ComputedHorizontalScrollBarVisibilityHorizontalOffsetExtentWidthViewportWidth

设置为 MultiBinding.ConverterParameter 0 或 100。 该值被视为百分比,并确定按钮在给定位置时 ScrollViewer 是否隐藏。 当 ScrollViewer 位于顶部时,顶部按钮的位置 ScrollViewer 为 0%,顶部按钮处于隐藏状态。 当 ScrollViewer 位于底部时,该位置 ScrollViewer 为 100%,底部按钮处于隐藏状态。

<!--ScrollViewer for a MenuItem-->
<MenuScrollingVisibilityConverter x:Key="MenuScrollingVisibilityConverter" />

<Style x:Key="MenuScrollViewer"
       TargetType="{x:Type ScrollViewer}"
       BasedOn="{x:Null}">
  <Setter Property="HorizontalScrollBarVisibility"
          Value="Hidden" />
  <Setter Property="VerticalScrollBarVisibility"
          Value="Auto" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type ScrollViewer}">
        <Grid SnapsToDevicePixels="True">
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
          </Grid.ColumnDefinitions>
          <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
          </Grid.RowDefinitions>
          <Border Grid.Row="1"
                  Grid.Column="0">
            <ScrollContentPresenter Margin="{TemplateBinding Padding}" />
          </Border>
          <RepeatButton Style="{StaticResource MenuScrollButton}"
                        Grid.Row="0"
                        Grid.Column="0"
                        Command="{x:Static ScrollBar.LineUpCommand}"
                        CommandTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                        Focusable="False">
            <RepeatButton.Visibility>
              <MultiBinding FallbackValue="Visibility.Collapsed"
                            Converter="{StaticResource MenuScrollingVisibilityConverter}"
                            ConverterParameter="0">
                <Binding RelativeSource="{RelativeSource TemplatedParent}"
                         Path="ComputedVerticalScrollBarVisibility" />
                <Binding RelativeSource="{RelativeSource TemplatedParent}"
                         Path="VerticalOffset" />
                <Binding RelativeSource="{RelativeSource TemplatedParent}"
                         Path="ExtentHeight" />
                <Binding RelativeSource="{RelativeSource TemplatedParent}"
                         Path="ViewportHeight" />
              </MultiBinding>
            </RepeatButton.Visibility>
            <Path Fill="{DynamicResource {x:Static SystemColors.MenuTextBrushKey}}"
                  Data="{StaticResource UpArrow}" />
          </RepeatButton>
          <RepeatButton Style="{StaticResource MenuScrollButton}"
                        Grid.Row="2"
                        Grid.Column="0"
                        Command="{x:Static ScrollBar.LineDownCommand}"
                        CommandTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                        Focusable="False">
            <RepeatButton.Visibility>
              <MultiBinding FallbackValue="Visibility.Collapsed"
                            Converter="{StaticResource MenuScrollingVisibilityConverter}"
                            ConverterParameter="100">
                <Binding RelativeSource="{RelativeSource TemplatedParent}"
                         Path="ComputedVerticalScrollBarVisibility" />
                <Binding RelativeSource="{RelativeSource TemplatedParent}"
                         Path="VerticalOffset" />
                <Binding RelativeSource="{RelativeSource TemplatedParent}"
                         Path="ExtentHeight" />
                <Binding RelativeSource="{RelativeSource TemplatedParent}"
                         Path="ViewportHeight" />
              </MultiBinding>
            </RepeatButton.Visibility>
            <Path Fill="{DynamicResource {x:Static SystemColors.MenuTextBrushKey}}"
                  Data="{StaticResource DownArrow}" />
          </RepeatButton>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

推荐阅读