2010-10-27 40 views
1

下午好,焦点和选择造型与多个可能的模板列表框项目

我已经消耗从模型的项目列表的列表框,地址和RAddresses(从地址继承)

现在,以前我已经在ItemContainerStyle中创建我的项目模板,这样我只有自己的焦点视觉效果(即没有虚线,没有浅灰色矩形等)。这在过去很好。

我现在需要两个模板,每个类型一个(地址和RAddress)。

<DataTemplate DataType="{x:Type DAL:RAddress}"> 

我也有我的列表框的ItemContainerStyle属性指向以下:

<Style x:Key="AddressContainerStyle" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
     <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
     <Setter Property="Padding" Value="0,0,0,0"/> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
    </Style> 

以前当模板应用到我在ListBox.resources为默认模板(如下所示)创建这些风格,这保持了虚线和灰色矩形的视觉效果。但是,现在他们这样做了,我设置的VisualState设置似乎不适用。

所有的DataTemplate实例如下:

<DataTemplate DataType="{x:Type DAL:Address}"> 
<Border x:Name="Bd" SnapsToDevicePixels="true" Background="#4C000000" CornerRadius="10" Padding="0" BorderBrush="#00FF0000" BorderThickness="1"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="SelectionStates"> 
      <VisualState x:Name="Unselected"/> 
      <VisualState x:Name="Selected"> 
       <Storyboard> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Bd"> 
         <EasingColorKeyFrame KeyTime="0" Value="#80000000"/> 
        </ColorAnimationUsingKeyFrames> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="Bd"> 
         <EasingColorKeyFrame KeyTime="0" Value="#00FF0000"/> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
      <VisualState x:Name="SelectedUnfocused"> 
       <Storyboard> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Bd"> 
         <EasingColorKeyFrame KeyTime="0" Value="#80000000"/> 
        </ColorAnimationUsingKeyFrames> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="Bd"> 
         <EasingColorKeyFrame KeyTime="0" Value="Red"/> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <Grid Height="Auto" Width="Auto"> 
     <CheckBox x:Name="checkBox" Content="CheckBox" Margin="0" VerticalAlignment="Top" d:LayoutOverrides="Width" Style="{DynamicResource EditGemStyle}" HorizontalAlignment="Right" IsChecked="{Binding EditMode}"/> 
     <StackPanel Margin="0" Orientation="Vertical" d:LayoutOverrides="Height"> 
      <Grid x:Name="DisplayGrid" Height="Auto" Width="Auto" d:LayoutOverrides="Width" VerticalAlignment="Stretch" Margin="7,3,11,3"> 
       <StackPanel Orientation="Vertical" Width="Auto" d:LayoutOverrides="Width, Height" Margin="0,0,10,0"> 
        <TextBlock x:Name="AddressFriendlyName" TextWrapping="Wrap" Text="{Binding AddressFriendlyName}" FontSize="18.667" Style="{DynamicResource Data}"/> 
        <TextBlock x:Name="Address1" TextWrapping="Wrap" Text="{Binding Address1}" d:LayoutOverrides="Width" FontSize="13.333" Style="{DynamicResource Data}"/> 
        <TextBlock x:Name="Address2" TextWrapping="Wrap" Text="{Binding Address2}" FontSize="13.333" Style="{DynamicResource Data}"/> 
        <TextBlock x:Name="Address3" TextWrapping="Wrap" Text="{Binding Address3}" FontSize="13.333" Style="{DynamicResource Data}"/> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock x:Name="City" TextWrapping="Wrap" Text="{Binding City}" FontSize="13.333" Style="{DynamicResource Data}"/> 
         <TextBlock TextWrapping="Wrap" Text=", " FontSize="13.333" Style="{DynamicResource Data}"/> 
         <TextBlock x:Name="State" TextWrapping="Wrap" Text="{Binding State}" Margin="0,0,5,0" FontSize="13.333" Style="{DynamicResource Data}"/> 
         <TextBlock x:Name="ZIP" TextWrapping="Wrap" Text="{Binding ZIP}" FontSize="13.333" Style="{DynamicResource Data}"/> 
        </StackPanel> 
        <TextBlock x:Name="Country" TextWrapping="Wrap" Text="{Binding Country}" FontSize="13.333" Style="{DynamicResource Data}"/> 
       </StackPanel> 
      </Grid> 
      <Grid x:Name="EditGrid" Height="Auto" Margin="7,3,11,0" Visibility="Collapsed"> 
       <StackPanel Orientation="Vertical" Width="Auto" Margin="0,0,10,0" d:LayoutOverrides="Width, Height"> 
        <TextBox x:Name="AddressFriendlyName1" TextWrapping="Wrap" Text="{Binding AddressFriendlyName}" Template="{DynamicResource SnazzyTextBoxTemplate}" Margin="0,2" Foreground="White"/> 
        <TextBox x:Name="Address4" TextWrapping="Wrap" Text="{Binding Address1}" d:LayoutOverrides="Width" Template="{DynamicResource SnazzyTextBoxTemplate}" Margin="0,2" Foreground="White"/> 
        <TextBox x:Name="Address5" TextWrapping="Wrap" Text="{Binding Address2}" Template="{DynamicResource SnazzyTextBoxTemplate}" Margin="0,2" Foreground="White"/> 
        <TextBox x:Name="Address6" TextWrapping="Wrap" Text="{Binding Address3}" Template="{DynamicResource SnazzyTextBoxTemplate}" Margin="0,2" Foreground="White"/> 
        <StackPanel Orientation="Horizontal"> 
         <TextBox x:Name="City1" TextWrapping="Wrap" Text="{Binding City}" Template="{DynamicResource SnazzyTextBoxTemplate}" Margin="0,2" Foreground="White"/> 
         <TextBlock TextWrapping="Wrap" Text=", " Foreground="White"/> 
         <TextBox x:Name="State1" TextWrapping="Wrap" Text="{Binding State}" Margin="0,2,5,2" Template="{DynamicResource SnazzyTextBoxTemplate}" Foreground="White"/> 
         <TextBox x:Name="ZIP1" TextWrapping="Wrap" Text="{Binding ZIP}" Template="{DynamicResource SnazzyTextBoxTemplate}" Margin="0,2" Foreground="White"/> 
        </StackPanel> 
        <TextBox x:Name="Country1" TextWrapping="Wrap" Text="{Binding Country}" Template="{DynamicResource SnazzyTextBoxTemplate}" Margin="0,2" Foreground="White"/> 
       </StackPanel> 
      </Grid> 
     </StackPanel> 
    </Grid> 
</Border> 
<DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding Address2}" Value="{x:Null}"> 
     <Setter TargetName="Address2" Property="Visibility" Value="Collapsed"/> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding Address3}" Value="{x:Null}"> 
     <Setter TargetName="Address3" Property="Visibility" Value="Collapsed"/> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding EditMode}" Value="False"> 
     <Setter Property="Visibility" TargetName="DisplayGrid" Value="Visible"/> 
     <Setter Property="Visibility" TargetName="EditGrid" Value="Collapsed"/> 
    </DataTrigger> 
    <DataTrigger Binding="{Binding EditMode}" Value="True"> 
     <Setter Property="Visibility" TargetName="DisplayGrid" Value="Collapsed"/> 
     <Setter Property="Visibility" TargetName="EditGrid" Value="Visible"/> 
    </DataTrigger> 
</DataTemplate.Triggers> 

以前我已经使用StyleSelector创建的ItemContainerStyles(每个类型)之间进行选择尝试。这导致我遇到了一个错误“不能动画”(0)。(1)'在一个不可变的对象实例上“,所以我开始查看当前的设置。

如何在同一个ListBox中托管的两个单独项目模板上强制执行自己的焦点和选择样式?

任何帮助将不胜感激。

回答

1

我认为您需要将故事板的规格移动到ItemContainerStyle,而不是让它们在DataTemplates本身中指定。这是更干,并将导致更少的并发症。

<Window.Resources> 

    <DataTemplate DataType="{x:Type DAL:RAddress}"> 
     <TextBlock>RAddress!</TextBlock> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type DAL:Address}"> 
     <TextBlock>Address!</TextBlock> 
    </DataTemplate> 
    <Style x:Key="IHateDottedBorders" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
     <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
     <Setter Property="Padding" Value="0,0,0,0"/> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="SelectionStates"> 
           <VisualState x:Name="Unselected"/> 
           <VisualState x:Name="Selected"> 
            <Storyboard> 
             <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Bd"> 
              <EasingColorKeyFrame KeyTime="0" Value="#80000000"/> 
             </ColorAnimationUsingKeyFrames> 
             <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="Bd"> 
              <EasingColorKeyFrame KeyTime="0" Value="#00FF0000"/> 
             </ColorAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="SelectedUnfocused"> 
            <Storyboard> 
             <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="Bd"> 
              <EasingColorKeyFrame KeyTime="0" Value="#80000000"/> 
             </ColorAnimationUsingKeyFrames> 
             <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="Bd"> 
              <EasingColorKeyFrame KeyTime="0" Value="Red"/> 
             </ColorAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="true"> 
          <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
         </Trigger> 
         <MultiTrigger> 
          <MultiTrigger.Conditions> 
           <Condition Property="IsSelected" Value="true"/> 
           <Condition Property="Selector.IsSelectionActive" Value="false"/> 
          </MultiTrigger.Conditions> 
          <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
         </MultiTrigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 


</Window.Resources> 

<Grid> 
    <ListBox ItemContainerStyle="{StaticResource IHateDottedBorders}" ItemsSource="{Binding CollectionOfAddresses}" /> 
</Grid> 
+0

上面的样式在单击列表框项时会返回被恨的“无法动画”(0)。(1)'对不可变对象实例'错误。我也尝试过一个你以前给过我的样式,它包含一个用于VisualState的setter的样式,但是VisualState和VisualStateManager没有一个有效的setter。任何其他想法? – CodeWarrior 2010-11-03 14:42:46