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