Listview在WPF中应用主题时不显示复选框

时间:2013-06-12 15:41:20

标签: .net wpf xaml mvvm

您好我在使用主题ThemeExpressionDark.xaml时没有在Listview中显示的复选框出现问题。

我在视图模型中有集合。这些集合项将与ListView中的复选框绑定。

我在ListView的XAML中的代码是这样的。

 <ListView Background="Transparent" x:Name="checkedListView" SelectionMode="Multiple" ItemsSource="{Binding CollectionOfDays}" ItemTemplate="{StaticResource ItemDataTemplate}"       CheckBox.Unchecked="OnUncheckItem" SelectionChanged="SelectDays" SelectedItem="{Binding SelectedItems}">

Checkbox DataTemplate的XAML代码和我在page.Resource中使用的主题是这样的

<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Skins/ThemeExpressionDark.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <Style x:Key="ListViewTransparentSelection_Both" TargetType="{x:Type ListViewItem}">
            <Style.Resources>
                <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"  Color="Transparent"/>
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"  Color="Transparent"/>
            </Style.Resources>
        </Style>
        <local:UriToBitmapConverter x:Key="UriToBitmapConverter" />    
        <DataTemplate x:Key="ItemDataTemplate">
            <CheckBox
        x:Name="checkbox" Foreground="Wheat" Content="{Binding}" Margin="10,0,0,0"
        Command="{Binding CheckBoxCommand}" CommandParameter="{Binding ElementName=checkedListView, Path=SelectedItems}" IsChecked="{Binding    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
        </DataTemplate>            
    </ResourceDictionary>
</Page.Resources>

当我在ListView中执行此XAML代码集时,复选框未显示。请告诉我DataTemplate或我正在使用的主题是否存在问题。

以下是我在主题ThemeExpressionDark.xaml中与Checkbox相关的XAML代码。

<Style x:Key="{x:Static ToolBar.CheckBoxStyleKey}"
       TargetType="{x:Type CheckBox}">
  <Setter Property="FontSize"
          Value="10" />
  <Setter Property="SnapsToDevicePixels"
          Value="true" />
  <Setter Property="FocusVisualStyle"
          Value="{DynamicResource CheckBoxFocusVisual}" />
  <Setter Property="Background"
          Value="{DynamicResource NormalBrush}" />
  <Setter Property="BorderBrush"
          Value="{DynamicResource NormalBorderBrush}" />
  <Setter Property="Template"
          Value="{DynamicResource CheckBoxTemplate}" />
  <Setter Property="Foreground"
          Value="{DynamicResource TextBrush}" />
</Style>
<Style TargetType="{x:Type CheckBox}">
  <Setter Property="SnapsToDevicePixels"
          Value="true" />
  <Setter Property="FocusVisualStyle"
          Value="{DynamicResource CheckBoxFocusVisual}" />
  <Setter Property="Background"
          Value="{DynamicResource NormalBrush}" />
  <Setter Property="Foreground"
          Value="{DynamicResource TextBrush}" />
  <Setter Property="BorderBrush"
          Value="{DynamicResource NormalBorderBrush}" />
  <Setter Property="Template"
          Value="{DynamicResource CheckBoxTemplate}" />
</Style>

<ControlTemplate x:Key="CheckBoxTemplate"
                 TargetType="{x:Type CheckBox}">
  <ControlTemplate.Resources>
    <Storyboard x:Key="HoverOn">
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                     Storyboard.TargetName="BackgroundOverlay"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.1000000"
                              Value="1" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="HoverOff">
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                     Storyboard.TargetName="BackgroundOverlay"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.4000000"
                              Value="0" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="PressedOn">
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                     Storyboard.TargetName="PressedRectangle"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.1000000"
                              Value="1" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="PressedOff">
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                     Storyboard.TargetName="PressedRectangle"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.3000000"
                              Value="0" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="CheckedTrue">
      <DoubleAnimationUsingKeyFrames Storyboard.TargetName="CheckIcon"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.1000000"
                              Value="1" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="CheckedFalse">
      <DoubleAnimationUsingKeyFrames Storyboard.TargetName="CheckIcon"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.4000000"
                              Value="0" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="IndeterminateOn">
      <DoubleAnimationUsingKeyFrames Storyboard.TargetName="IndeterminateIcon"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.2000000"
                              Value="1" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="IndeterminateOff">
      <DoubleAnimationUsingKeyFrames Storyboard.TargetName="IndeterminateIcon"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.4000000"
                              Value="0" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="FocussedOn">
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                     Storyboard.TargetName="ContentFocusVisualElement"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.1000000"
                              Value="1" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
    <Storyboard x:Key="FocussedOff">
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                     Storyboard.TargetName="ContentFocusVisualElement"
                                     Storyboard.TargetProperty="(UIElement.Opacity)">
        <SplineDoubleKeyFrame KeyTime="00:00:00.3000000"
                              Value="0" />
      </DoubleAnimationUsingKeyFrames>
    </Storyboard>
  </ControlTemplate.Resources>
  <BulletDecorator Background="Transparent"
                   x:Name="bulletDecorator">
    <BulletDecorator.Bullet>
      <Grid Width="16"
            Height="16">
        <Rectangle Height="14"
                   Margin="1"
                   x:Name="Background"
                   Width="14"
                   Fill="{TemplateBinding Background}"
                   Stroke="{TemplateBinding BorderBrush}"
                   StrokeThickness="{TemplateBinding BorderThickness}" />
        <Rectangle Height="14"
                   Margin="1"
                   x:Name="BackgroundOverlay"
                   Width="14"
                   Opacity="0"
                   Fill="{x:Null}"
                   Stroke="{StaticResource HoverBrush}"
                   StrokeThickness="2" />
        <Rectangle Height="16"
                   x:Name="PressedRectangle"
                   Width="16"
                   IsHitTestVisible="false"
                   Opacity="0"
                   Stroke="{StaticResource HoverBrush}"
                   StrokeThickness="1" />
        <Path Height="10"
              Margin="1,1,0,1.5"
              x:Name="CheckIcon"
              Width="10.5"
              Opacity="0"
              Fill="{StaticResource GlyphBrush}"
              Stretch="Fill"
              Data="M102.03442,598.79645 L105.22962,597.78918 L106.78825,600.42358 C106.78825,600.42358 108.51028,595.74304 110.21724,593.60419 C112.00967,591.35822 114.89314,591.42316 114.89314,591.42316 C114.89314,591.42316 112.67844,593.42645 111.93174,594.44464 C110.7449,596.06293 107.15683,604.13837 107.15683,604.13837 z" />
        <Rectangle Height="8"
                   x:Name="IndeterminateIcon"
                   Width="10"
                   Opacity="0"
                   Fill="{StaticResource GlyphBrush}" />
        <Rectangle Height="14"
                   x:Name="DisabledVisualElement"
                   Width="14"
                   Opacity="0"
                   Fill="{StaticResource DisabledBackgroundBrush}" />
        <Rectangle Height="16"
                   x:Name="ContentFocusVisualElement"
                   Width="16"
                   IsHitTestVisible="false"
                   Opacity="0"
                   Stroke="{StaticResource HoverShineBrush}"
                   StrokeThickness="1" />
        <Rectangle Height="12"
                   x:Name="ShineRectangle"
                   Width="14"
                   IsHitTestVisible="false"
                   Opacity="1"
                   Stroke="{x:Null}"
                   StrokeThickness="1"
                   Fill="{StaticResource ShineBrush}"
                   Margin="2,2,2,2" />
      </Grid>
    </BulletDecorator.Bullet>
    <ContentPresenter RecognizesAccessKey="True"
                      Margin="5,0,0,0"
                      VerticalAlignment="Top"
                      HorizontalAlignment="Left" />
  </BulletDecorator>
  <ControlTemplate.Triggers>
    <Trigger Property="IsFocused"
             Value="True">
      <Trigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource FocussedOff}"
                         x:Name="FocussedOff_BeginStoryboard" />
      </Trigger.ExitActions>
      <Trigger.EnterActions>
        <BeginStoryboard Storyboard="{StaticResource FocussedOn}"
                         x:Name="FocussedOn_BeginStoryboard" />
      </Trigger.EnterActions>
    </Trigger>
    <MultiTrigger>
      <MultiTrigger.Conditions>
        <Condition Property="IsChecked"
                   Value="True" />
        <Condition Property="IsThreeState"
                   Value="True" />
      </MultiTrigger.Conditions>
      <MultiTrigger.EnterActions>
        <BeginStoryboard x:Name="ThreeStateOn_BeginStoryboard"
                         Storyboard="{StaticResource CheckedFalse}" />
      </MultiTrigger.EnterActions>
      <MultiTrigger.ExitActions>
        <BeginStoryboard x:Name="ThreeStateOff_BeginStoryboard"
                         Storyboard="{StaticResource CheckedTrue}" />
      </MultiTrigger.ExitActions>
    </MultiTrigger>
    <MultiTrigger>
      <MultiTrigger.Conditions>
        <Condition Property="IsChecked"
                   Value="{x:Null}" />
        <Condition Property="IsThreeState"
                   Value="True" />
      </MultiTrigger.Conditions>
      <MultiTrigger.EnterActions>
        <BeginStoryboard x:Name="ThreeStateOn1_BeginStoryboard"
                         Storyboard="{StaticResource IndeterminateOn}" />
      </MultiTrigger.EnterActions>
      <MultiTrigger.ExitActions>
        <BeginStoryboard x:Name="ThreeStateOff1_BeginStoryboard"
                         Storyboard="{StaticResource IndeterminateOff}" />
      </MultiTrigger.ExitActions>
      <Setter Property="Visibility"
              TargetName="CheckIcon"
              Value="Hidden" />
    </MultiTrigger>
    <Trigger Property="IsChecked"
             Value="True">
      <Trigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource CheckedFalse}"
                         x:Name="CheckedTrue_BeginStoryboard" />
      </Trigger.ExitActions>
      <Trigger.EnterActions>
        <BeginStoryboard x:Name="CheckedTrue_BeginStoryboard1"
                         Storyboard="{StaticResource CheckedTrue}" />
      </Trigger.EnterActions>
    </Trigger>
    <Trigger Property="IsMouseOver"
             Value="true">
      <Trigger.EnterActions>
        <BeginStoryboard Storyboard="{StaticResource HoverOn}" />
      </Trigger.EnterActions>
      <Trigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource HoverOff}" />
      </Trigger.ExitActions>
    </Trigger>
    <Trigger Property="IsEnabled"
             Value="false">
      <Setter Property="Fill"
              Value="{DynamicResource DisabledBackgroundBrush}"
              TargetName="Background" />
      <Setter Property="Stroke"
              Value="{DynamicResource DisabledBorderBrush}"
              TargetName="Background" />
      <Setter Property="Foreground"
              Value="{DynamicResource DisabledForegroundBrush}" />
      <Setter Property="Opacity"
              TargetName="bulletDecorator"
              Value="0.5" />
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

2 个答案:

答案 0 :(得分:1)

如果您所指的主题与我过去使用的主题相同,那么请查看下面的CheckBox控件模板。请特别注意以下标记内的SolidColorBrush

<Border.BorderBrush>
    <SolidColorBrush Color="{DynamicResource BlackColor}" />
</Border.BorderBrush>

您主题中的画笔可能会设置为与背景融为一体的颜色。因为这会使边框不可见,所以复选框也会显示为不可见。尝试将边框画笔设置为其他颜色。我将我的设置为BlackColor,它匹配主题中的所有其他边框。

<ControlTemplate x:Key="NuclearCheckBox"  TargetType="{x:Type CheckBox}">
    <BulletDecorator Background="Transparent" x:Name="bulletDecorator">
        <BulletDecorator.Bullet>
            <Grid Width="13" Height="13">
                <Border x:Name="Border" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="0,0,0,0" Background="{DynamicResource LightBrush}">
                    <Border.BorderBrush>
                        <SolidColorBrush Color="{DynamicResource BlueBorderColor}" />
                    </Border.BorderBrush>
                    <Rectangle Visibility="Hidden" Fill="{DynamicResource GlyphBrush}" x:Name="rectangle" Margin="1,1,1,1" />
                </Border>
                <Path Stretch="Fill" Stroke="{DynamicResource GlyphBrush}" StrokeThickness="2" x:Name="path" Width="Auto" Data="M1.0924787,5.372821 L3.1785986,10.519821 10.528543,2.5198207" Margin="1.577,0.134,-0.013,2.866" />
            </Grid>
        </BulletDecorator.Bullet>
        <ContentPresenter RecognizesAccessKey="True" Margin="5,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" />
    </BulletDecorator>
    <ControlTemplate.Triggers>
    </ControlTemplate.Triggers>
</ControlTemplate>

答案 1 :(得分:0)

通过删除主题ListViewItem的{​​{1}}代码,我解决了XAML下的checbox的重叠问题。在ThemeExpressionDark样式中的XAML下的Border

ListViewItem

并应用了一些基本样式而不是<Style TargetType="{x:Type ListViewItem}"> <Border SnapsToDevicePixels="true" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="4" x:Name="border"> <Grid Margin="2,0,2,0"> <Rectangle x:Name="Background" IsHitTestVisible="False" Opacity="0.25" Fill="{StaticResource NormalBrush}" RadiusX="1" RadiusY="1"/> <Rectangle x:Name="HoverRectangle" IsHitTestVisible="False" Opacity="0" Fill="{StaticResource NormalBrush}" RadiusX="1" RadiusY="1"/> <Rectangle x:Name="SelectedRectangle" IsHitTestVisible="False" Opacity="0" Fill="{StaticResource SelectedBackgroundBrush}" RadiusX="1" RadiusY="1"/> <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Margin="0,2,0,2" VerticalAlignment="Stretch" /> </Grid> </Style> 以上。