0

我有一个上下文菜单出现在用户控制结构中的问题,如以下 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 元素之前,某些东西正在消耗这些事件,或者它可能是一个焦点问题,但想不出如何追踪问题的原因。

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

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

4

0 回答 0