代码之家  ›  专栏  ›  技术社区  ›  JSmyth

Silverlight-停止列表框上的突出显示

  •  15
  • JSmyth  · 技术社区  · 15 年前

    我有一个Silverlight列表框,我想删除当用户选择列表框中的项目时发生的颜色更改突出显示。

    默认情况下,当选中某个项目时,该项目将突出显示一种浅蓝色。

    我怎样才能阻止这一切的发生?

    作为一个附带问题,我该如何将其定制为任意任意颜色?

    谢谢。

    3 回复  |  直到 13 年前
        1
  •  20
  •   Peter McG    15 年前

    可以通过自定义列表框项的现有控件模板来完成此操作。这样做的简单方法是启动表达式混合,右键单击一个列表框项,转到“编辑控制部件(模板)”并选择“编辑副本”…然后根据需要自定义FillColor和FillColor2矩形的填充颜色。

    下面的XAML将ListBoxItem鼠标悬停颜色设置为透明,所选颜色设置为亮绿色,但您可以根据需要自定义此设置:

    <UserControl x:Class="SilverlightApplication2.Page"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
        Width="400" Height="300" Background="#FF000000">
      <UserControl.Resources>
        <Style x:Key="ListBoxItemStyleTransparent" TargetType="ListBoxItem">
          <Setter Property="Padding" Value="3"/>
          <Setter Property="HorizontalContentAlignment" Value="Left"/>
          <Setter Property="VerticalContentAlignment" Value="Top"/>
          <Setter Property="Background" Value="Transparent"/>
          <Setter Property="BorderThickness" Value="1"/>
          <Setter Property="TabNavigation" Value="Local"/>
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="ListBoxItem">
                <Grid Background="{TemplateBinding Background}">
                  <vsm:VisualStateManager.VisualStateGroups>
                    <vsm:VisualStateGroup x:Name="CommonStates">
                      <vsm:VisualState x:Name="Normal"/>
                      <vsm:VisualState x:Name="MouseOver">
                        <Storyboard>
                          <DoubleAnimationUsingKeyFrames Storyboard.TargetName="fillColor" Storyboard.TargetProperty="Opacity">
                            <SplineDoubleKeyFrame KeyTime="0" Value=".35"/>
                          </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                      </vsm:VisualState>
                      <vsm:VisualState x:Name="Disabled">
                        <Storyboard>
                          <DoubleAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="Opacity">
                            <SplineDoubleKeyFrame KeyTime="0" Value=".55"/>
                          </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                      </vsm:VisualState>
                    </vsm:VisualStateGroup>
                    <vsm:VisualStateGroup x:Name="SelectionStates">
                      <vsm:VisualState x:Name="Unselected"/>
                      <vsm:VisualState x:Name="Selected">
                        <Storyboard>
                          <DoubleAnimationUsingKeyFrames Storyboard.TargetName="fillColor2" Storyboard.TargetProperty="Opacity">
                            <SplineDoubleKeyFrame KeyTime="0" Value=".75"/>
                          </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                      </vsm:VisualState>
                    </vsm:VisualStateGroup>
                    <vsm:VisualStateGroup x:Name="FocusStates">
                      <vsm:VisualState x:Name="Focused">
                        <Storyboard>
                          <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Visibility">
                            <DiscreteObjectKeyFrame KeyTime="0">
                              <DiscreteObjectKeyFrame.Value>
                                <Visibility>Visible</Visibility>
                              </DiscreteObjectKeyFrame.Value>
                            </DiscreteObjectKeyFrame>
                          </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                      </vsm:VisualState>
                      <vsm:VisualState x:Name="Unfocused"/>
                    </vsm:VisualStateGroup>
                  </vsm:VisualStateManager.VisualStateGroups>
                  <Rectangle x:Name="fillColor" IsHitTestVisible="False" Opacity="0" RadiusX="1" RadiusY="1" Fill="Transparent"/>
                  <Rectangle x:Name="fillColor2" IsHitTestVisible="False" Opacity="0" Fill="#FF00FF00" RadiusX="1" RadiusY="1"/>
                  <ContentPresenter HorizontalAlignment="Left" Margin="{TemplateBinding Padding}" x:Name="contentPresenter" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                  <Rectangle x:Name="FocusVisualElement" Visibility="Collapsed" Stroke="#FF6DBDD1" StrokeThickness="1" RadiusX="1" RadiusY="1"/>
                </Grid>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
      </UserControl.Resources>
      <Grid x:Name="LayoutRoot" Background="White">
        <ListBox x:Name="ListBoxTest">
          <ListBoxItem Content="Some String" Style="{StaticResource ListBoxItemStyleTransparent}" />
        </ListBox>
      </Grid>
    </UserControl>
    

    FillColor矩形指定用户鼠标悬停在ListBoxItem上时使用的颜色。在上面的代码中,我将其设置为透明的,这样当您将鼠标悬停在ListBoxItem上时,就不会显示任何颜色。

    FillColor2指定选择ListBoxItem时要使用的颜色。在上面的代码中,我指定了ff00ff00,这样当选择ListBoxItem时,颜色将是亮绿色。

    在您的情况下,您可以将FillColor2矩形的Fill属性设置为透明,以在用户选择项时模拟无颜色。

        2
  •  6
  •   Peter Gfader    13 年前

    如果不需要选择,可以考虑使用itemscontrol而不是列表框。
    (itemsControl是同一控件的简单版本)。

    http://forums.silverlight.net/post/140375.aspx

        3
  •  -1
  •   animuson    13 年前
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Focusable" Value="false"></Setter>
        </Style>
    </ListBox.ItemContainerStyle>