簡體   English   中英

如何在WPF的上下文菜單中正確觸發click事件

[英]How to properly fire the click event in a contextmenu in WPF

因此,我試圖為我的一個快捷菜單項創建一個click事件,但是這給我拋出了一個我從未見過的錯誤。 Google上沒有太多信息,我所看到的信息沒有幫助我,因為我不了解。

引發錯誤的行是這個

GridView ColumnHeaderContainerStyle =“ {StaticResource GridViewColumnHeaderStyle1}”

'cmndOP_Click'無效。 “單擊”不是“ System.Windows.Controls.GridView”上的事件。

讀取錯誤消息后,我了解到“單擊”在gridview中不是有效事件,但在listviewitem中卻不在gridview中。

是什么導致此錯誤,以后我應該怎么做才能避免這種情況?

<ListView Margin="10,36,520,10" ScrollViewer.HorizontalScrollBarVisibility="Hidden" BorderBrush="Black" Padding="-1, -1, 1, 0" Background="Transparent" BorderThickness="1.000001" Name="lvUsers"  Style="{DynamicResource ListViewStyle1}">
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="ContextMenu">
                        <Setter.Value>
                            <ContextMenu>
                                <MenuItem Name="cmndOP" Header="OP User" Click="cmndOP_Click"/>
                                <MenuItem Header="Kick User"/>
                                <MenuItem Header="Ban User"/>
                                <MenuItem Header="Send Command"/>
                            </ContextMenu>
                        </Setter.Value>
                    </Setter>
                    <Setter Property="Background" Value="Transparent" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListViewItem}">
                                <Border
                         BorderBrush="Transparent"
                         BorderThickness="0"
                         Background="{TemplateBinding Background}">

                                    <GridViewRowPresenter HorizontalAlignment="Stretch" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Width="Auto" Margin="0" Content="{TemplateBinding Content}"/>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>

                    </Setter>

                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Foreground" Value="White" />
                            <Setter Property="Background" Value="#696969" />
                            <Setter Property="BorderBrush" Value="#696969" />
                            <Setter Property="BorderThickness" Value="0" />
                        </Trigger>

                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Foreground" Value="White" />
                            <Setter Property="Background" Value="#696969" />
                            <Setter Property="BorderBrush" Value="#696969" />
                            <Setter Property="BorderThickness" Value="0" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView ColumnHeaderContainerStyle="{StaticResource GridViewColumnHeaderStyle1}">
                    <GridViewColumn x:Name="GridViewColumnName" Header="Name" Width="165">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <Image x:Name="Image_GridViewColumnName" Width="16" Height="16" Source="Images\minecraft.png" />
                                    <Label Content="{Binding Username}" Visibility="Visible" />
                                </StackPanel>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>

            </ListView.View>
        </ListView>

而它背后的

private void cmndOP_Click(object sender, RoutedEventArgs e)
        {
            Commands cmd = new Commands();
            cmd.OpUser(lvUsers.SelectedItem.ToString());
        }

編輯

這是錯誤發生的地方。 這也在App.xaml中,因為否則我會得到另一個錯誤

<Style x:Key="GridViewColumnHeaderStyle1" TargetType="{x:Type GridViewColumnHeader}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GridViewColumnHeader}">
                        <Border BorderThickness="0,0,0,1" BorderBrush="Black" Background="Transparent">
                            <TextBlock x:Name="ContentHeader" Text="{TemplateBinding Content}" Padding="5,5,5,5" Width="{TemplateBinding Width}" TextAlignment="Center" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="OverridesDefaultStyle" Value="True" />
            <Setter Property="Foreground" Value="Black" />
            <Setter Property="FontFamily" Value="Segoe UI" />
            <Setter Property="FontSize" Value="12" />
        </Style>

我很驚訝地發現您提供的XAML可重現您的錯誤。 當我將上下文菜單定義為資源並相應地更新setter時,我不再收到錯誤。

<ListView Margin="10,36,520,10" ScrollViewer.HorizontalScrollBarVisibility="Hidden" BorderBrush="Black" Padding="-1, -1, 1, 0" Background="Transparent" BorderThickness="1.000001" Name="lvUsers"  >
    <ListView.Resources>
        <ContextMenu x:Key="ListViewItemContextMenu">
            <MenuItem Name="cmndOP" Header="OP User" Click="cmndOP_Click" />
            <MenuItem Header="Kick User"/>
            <MenuItem Header="Ban User"/>
            <MenuItem Header="Send Command"/>
        </ContextMenu>
    </ListView.Resources>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="ContextMenu" Value="{StaticResource ListViewItemContextMenu}" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM