0

我的问题是我有三个选项卡控件,每个选项卡控件都有一个列表框,该列表框具有 ListBox 和 ItemContainerStyle 的样式,选项卡内的所有列表框的样式都相同。

其中两个选项卡使用 CollectionViewSource 进行数据绑定。

问题是,一旦我尝试进入选项卡 2,我就会得到一个异常,我似乎无法找到从哪里来(我也厌倦了启用第一次机会异常,但什么也没有)

玩弄它我发现如果我从选项卡二中的 ListBox 中删除 ItemContainerStyle 它不再崩溃。另一种阻止它崩溃的方法是在列表框中没有任何项目。另一种方法是不使用 CollectionViewSource,而是在列表上使用 GetDefaultView() 并绑定到该列表。

这是我用来绑定到列表框的行:

        this.FListViewSource = (this.FindResource("FirstCollectionViewSource") as AutoRefreshCollectionViewSource);
        this.FListViewSource.Source = this.FirstList;
        this.FListView = (this.FListViewSource.View as ListCollectionView);


       this.SListViewSource = (this.FindResource("SecondCollectionViewSource") as AutoRefreshCollectionViewSource);
       this.SListViewSource.Source = testing;
        this.SListView = (this.SListViewSource.View as ListCollectionView);

这是选项卡控件的 XAML:

          <TabControl Width="Auto" Height="Auto">
                    <TabItem Header="tab 1">
                        <StackPanel Name =first_Panel" >
                            <ListBox  Style="{StaticResource lb_ms}"  ItemContainerStyle="{StaticResource black_lb}" Width="160"  Name="first_lb"  
                                      ItemsSource="{Binding}" DisplayMemberPath="name" MinHeight="400" MaxHeight="500" ButtonBase.Click="lb_Click" Margin="5,0,5,0"/>

                        </StackPanel>
                    </TabItem>
                    <TabItem Header="tab 2">
                        <StackPanel Name ="second_Panel"  DataContext="{Binding Source={StaticResource FirstCollectionViewSource}}" FlowDirection="LeftToRight" Background="#333333">

                            <ListBox  ItemsSource="{Binding}" Style="{StaticResource lb_ms}"  ItemContainerStyle="{StaticResource black_lb}" Width="160"  Name="second_lb"  
                                      DisplayMemberPath="name"  MinHeight="400" MaxHeight="500" ButtonBase.Click="lb_Click" Margin="5,0,5,0"/>        
                      </StackPanel>
                    </TabItem>
                    <TabItem Header="Media">

                    </TabItem>
                    <TabItem Header="Domains">
                        <StackPanel Name ="third_Panel" DataContext="{Binding Source={StaticResource SecondCollectionViewSource}}" FlowDirection="LeftToRight" Background="#333333">

                            <ListBox  Style="{StaticResource lb_ms}"  ItemContainerStyle="{StaticResource black_lb}" Width="160"  Name="third_lb"  
                                      ItemsSource="{Binding}" DisplayMemberPath="name" MinHeight="400" MaxHeight="400" ButtonBase.Click="lb_Click" Margin="5,0,5,0" SelectionMode="Multiple" />

                        </StackPanel>
                    </TabItem>
                </TabControl>

这是包含样式的资源目录:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml" />
</ResourceDictionary.MergedDictionaries>

<Style x:Key="black_lb" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Foreground" Value="#FFFFFF" />
    <Setter Property="FontFamily" Value="Verdana" />
    <Setter Property="FontSize" Value="11" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <Canvas Name="can" Width="Auto" Height="25">
                    <Rectangle  Name="filler" Canvas.Top="0" Canvas.Left="0" Width="200" Height="25">
                        <Rectangle.Fill>
                            <SolidColorBrush x:Name="fillb" Color="#333333"/>
                        </Rectangle.Fill>
                    </Rectangle>
                    <Path d:LastTangent="0,0" Stroke="{x:Null}" Fill="#FF6E00" HorizontalAlignment="Right" VerticalAlignment="Top" Width="7" Height="7" Canvas.Left="15" Opacity="0" Canvas.Top="6" x:Name="Path" RenderTransformOrigin="0.5,0.5" Stretch="Fill" Data="M601.11544,190.39485 L590.06202,213.0964 613,213">
                        <Path.RenderTransform>
                            <TransformGroup>
                                <RotateTransform Angle="90"/>
                            </TransformGroup>
                        </Path.RenderTransform>
                    </Path>

                    <StackPanel Panel.ZIndex="1000" Name="ActionsContainer" Visibility="Hidden" Canvas.Right="0" HorizontalAlignment="Right"  Orientation="Horizontal">
                        <Button Name="btn_edit" FontSize="10" Content="Edit" Height="20" Width="Auto"/>
                        <Button Name="btn_delete" FontSize="10" Content="Delete" Height="20" Width="Auto"/>
                    </StackPanel>
                    <ContentPresenter Name="con" Canvas.Top="2" Canvas.Left="10"/>

                            <!--
                    <ContentPresenter Name="con" Content="{TemplateBinding ContentControl.Content}" />
                    <ContentControl Name="DesignerItem"
                                 Canvas.Top="2"
                                Canvas.Left="10"
                                />
                    -->



                </Canvas>


                <ControlTemplate.Resources>
                    <Storyboard x:Key="SelectedStory">

                        <ColorAnimation Storyboard.TargetName="fillb" Storyboard.TargetProperty="(SolidColorBrush.Color)" From="#333333" To="#111111" Duration="0:0:0.1" />

                        <DoubleAnimation Storyboard.TargetName="con" Storyboard.TargetProperty="(Canvas.Left)" From="10" To="30" Duration="0:0:0.1" />
                        <DoubleAnimation Storyboard.TargetName="Path" Storyboard.TargetProperty="(Path.Opacity)" From="0" To="1" Duration="0:0:0.1" />
                        <DoubleAnimation Storyboard.TargetName="Path" Storyboard.TargetProperty="(Canvas.Left)" From="15" To="10" Duration="0:0:0.2" />
                    </Storyboard>

                    <Storyboard x:Key="unSelectedStory">

                        <ColorAnimation  Storyboard.TargetName="fillb" Storyboard.TargetProperty="(SolidColorBrush.Color)" From="#111111" To="#333333" Duration="0:0:0.8" />

                        <DoubleAnimation Storyboard.TargetName="con" Storyboard.TargetProperty="(Canvas.Left)" From="30" To="10" Duration="0:0:0.3" />
                        <DoubleAnimation Storyboard.TargetName="Path" Storyboard.TargetProperty="(Path.Opacity)" From="1" To="0" Duration="0:0:0.1" />
                        <DoubleAnimation Storyboard.TargetName="Path" Storyboard.TargetProperty="(Canvas.Left)" From="10" To="15" Duration="0:0:0.1" />
                    </Storyboard>

                    <Storyboard x:Key="CurrentlySlecetedStory">

                        <ColorAnimation Storyboard.TargetName="fillb" Storyboard.TargetProperty="(SolidColorBrush.Color)" From="#111111" To="#111111" Duration="0:0:0.1" />

                        <DoubleAnimation Storyboard.TargetName="con" Storyboard.TargetProperty="(Canvas.Left)" From="30" To="30" Duration="0:0:0.1" />
                        <DoubleAnimation Storyboard.TargetName="Path" Storyboard.TargetProperty="(Path.Opacity)" From="1" To="1" Duration="0:0:0.1" />
                        <DoubleAnimation Storyboard.TargetName="Path" Storyboard.TargetProperty="(Canvas.Left)" From="10" To="15" Duration="0:0:0.2" />
                    </Storyboard>

                    <SolidColorBrush x:Key="fillb" Color="#333333" />
                </ControlTemplate.Resources>

                <ControlTemplate.Triggers>


                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="ListBoxItem.IsMouseOver" Value="True" />
                            <Condition Property="ListBoxItem.IsSelected" Value="True" />
                        </MultiTrigger.Conditions>
                           <MultiTrigger.Setters>
                               <Setter TargetName="ActionsContainer" Property="Visibility" Value="{x:Static Visibility.Visible}"/>
                           </MultiTrigger.Setters>
                    </MultiTrigger>




                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="ListBoxItem.IsMouseOver" Value="True" />
                            <Condition Property="ListBoxItem.IsSelected" Value="False" />
                        </MultiTrigger.Conditions>
                        <MultiTrigger.EnterActions>

                            <BeginStoryboard Selector.IsSelected="True"  Storyboard="{StaticResource SelectedStory}">

                            </BeginStoryboard>
                        </MultiTrigger.EnterActions>
                        <MultiTrigger.ExitActions>
                            <BeginStoryboard Storyboard="{StaticResource unSelectedStory}">
                            </BeginStoryboard>
                        </MultiTrigger.ExitActions>
                    </MultiTrigger>



                    <EventTrigger RoutedEvent="ListBoxItem.Selected">
                        <EventTrigger.Actions>
                            <BeginStoryboard  Name="SelectedItemStory" Storyboard="{StaticResource CurrentlySlecetedStory}">

                            </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>

                    <EventTrigger RoutedEvent="ListBoxItem.Unselected">
                        <EventTrigger.Actions>
                           <StopStoryboard BeginStoryboardName="SelectedItemStory" />
                        </EventTrigger.Actions>
                    </EventTrigger>

                </ControlTemplate.Triggers>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>



<Style x:Key="lb_ms" TargetType="ListBox">
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
    <Setter Property="MinWidth" Value="120"/>
    <Setter Property="MinHeight" Value="95"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBox">
                <Border 
                                          Name="Border" 
                                          Background="#333333"

                                          BorderBrush="{StaticResource SolidBorderBrush}"
                                          BorderThickness="1"
                                          CornerRadius="5">
                    <ScrollViewer 
                                            Margin="0"
                                            Focusable="false">
                        <StackPanel Margin="2" IsItemsHost="True" />
                    </ScrollViewer>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter TargetName="Border" Property="Background"
                                                    Value="{StaticResource DisabledBackgroundBrush}" />
                        <Setter TargetName="Border" Property="BorderBrush"
                                                    Value="{StaticResource DisabledBorderBrush}" />
                    </Trigger>
                    <Trigger Property="IsGrouping" Value="true">
                        <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

4

1 回答 1

0

为了不崩溃,我必须在使用该样式的列表框上添加 SelectionMode="Multiple",问题是为什么?

于 2009-03-26T15:58:54.913 回答