我在用户控件结构中出现的上下文菜单出现问题,如下面的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。