WPF ListView中的上下文菜单表现不佳/性能不佳

时间:2013-11-10 00:51:08

标签: c# wpf listview

我在用户控件结构中出现的上下文菜单出现问题,如下面的XAML所示。

首先,我有一个代表日历的用户控件。它由7x6网格组成;网格的每个单元格表示日历上的日期。这个XAML是我实际建议的简化版本,在我认为它们不相关的情况下删除了详细信息。请注意,日历网格(ListView)位于选项卡上(不确定它是否与我的问题有任何关联,或者此控件在主机窗口中的另一级选项卡内运行)。

<UserControl x:Class="MyControl"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="600" >
    <TabControl >
        <TabItem>
            <TabItem.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Text="Calendar" />
                </DataTemplate>
            </TabItem.HeaderTemplate>
                <Grid>
                <ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
                    <ListView.ItemsPanel>
                        <ItemsPanelTemplate>
                            <UniformGrid Rows="6" Columns="7" />
                        </ItemsPanelTemplate>
                    </ListView.ItemsPanel>
                    <ListView.Resources>
                        <Style TargetType="{x:Type ListView}">
                            <Setter Property="ItemContainerStyle">
                                <Setter.Value>
                                    <Style TargetType="ListViewItem">
                                        <Setter Property="VerticalAlignment" Value="Stretch"/>
                                        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
                                        <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                                    </Style>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </ListView.Resources>
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <local:CalendarCell  Updated="CalendarCell_Updated"/>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </Grid>
        </TabItem>
    </TabControl>
</UserControl>

在上述网格的每个单元格中,是一个用户控件(CalendarCell),表示日历上的日期,如下所示。此控件的部分结构是一个ListView,其中包含要为日期显示的项目:

<UserControl x:Class="CalendarCell"
             d:DesignHeight="300" d:DesignWidth="300" >
    <UserControl.Resources>
        <SolidColorBrush x:Key="ThisMonthTextBrush" Color="Black" />
        <SolidColorBrush x:Key="TodayTextBrush" Color="Red" />
        <SolidColorBrush x:Key="OtherMonthTextBrush" Color="LightGray" />
        <ContextMenu x:Key="ItemContextMenu">
            <MenuItem Name="Edit" Header="Edit This Item" Click="Edit_Click" />
            <MenuItem Name="Delete" Header="Delete This Item" Click="Delete_Click" />
        </ContextMenu>
    </UserControl.Resources>
    <Border x:Name="CellBorder" BorderThickness="1" BorderBrush="Gray" Padding="3">
        <Grid >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <ListView Grid.Row="1" ItemsSource="{Binding Items}" BorderBrush="Transparent" BorderThickness="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionMode="Single" SelectionChanged="ListView_SelectionChanged">
                <ListView.ItemContainerStyle>
                    <Style TargetType="ListViewItem">
                        <Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}"/>
                    </Style>
                </ListView.ItemContainerStyle>
                <ListView.ItemTemplate>
                    <DataTemplate >
                        <Border x:Name="MyBorder"  >
                            <TextBlock Padding="3" FontSize="12" Text="{Binding Path=Description}" ToolTip="{Binding Path=Note}" TextWrapping="Wrap" VerticalAlignment="Top"  />
                        </Border>
                        <DataTemplate.Triggers>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsMouseOver}" Value="True">
                                <Setter TargetName="MyBorder" Property="Background" Value="LightGray"/>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsMouseOver}" Value="False">
                                <Setter TargetName="MyBorder" Property="Background" Value="White"/>
                            </DataTrigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
            <TextBlock x:Name="DayOfMonth" Padding="3" FontSize="16" FontWeight="Bold" Text="{Binding Path=Date.Day}" VerticalAlignment="Top" Foreground="{Binding Path=ItemBrush}" />
        </Grid>
        <Border.Style>
            <Style TargetType="Border">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True">
                        <Setter Property="BorderBrush" Value="Black"/>
                        <Setter Property="BorderThickness" Value="3"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
    </Border>
</UserControl>

我所有这一切的问题在于附加到日期的ListView项目的上下文菜单的行为。上下文菜单只会偶尔显示...如果我尝试几次,或按住右键几秒钟,我可以显示菜单;快速点击(通常用来调用上下文菜单)很少有效。当菜单出现时,它按预期工作......它只需要大量的持久性和摆弄就可以显示它。

我怀疑某些东西在它们被传递到适当的UI元素之前消耗了这些事件,或者它可能是一个焦点问题,但却无法想到如何追踪问题的原因。

请注意,我使用数据触发器添加悬停反馈(正常工作)...如果删除数据触发器,则不会改变上下文菜单行为,因此它们似乎与问题无关。 / p>

顺便说一句,这是Vista SP2上的VS2010 .NET 4。

0 个答案:

没有答案