【问题标题】:Setting event handlers inside a Setter.Value structure在 Setter.Value 结构中设置事件处理程序
【发布时间】:2011-01-20 20:34:30
【问题描述】:

我有一个ListView,我想设置一个上下文菜单,我不仅可以在右键单击某些列中的某些文本时打开它,还可以在ListViewItem 上的任何位置打开它,这样做我想我' d 只需使用样式设置器设置我的ContextMenu,因为我无法直接访问ListViewItem

不幸的是,当您尝试这样做时,它不会编译:

<Style TargetType="ListViewItem">
    <Setter Property="ContextMenu">
        <Setter.Value>
            <ContextMenu>
                <MenuItem Header="Header" Click="Handler"/>
                ...
            </ContextMenu>
        </Setter.Value>
    </Setter>
</Style>

错误 102“处理程序”无效。 “点击”不是事件 'System.Windows.Controls.GridView'。

我认为您可以通过为 Click 事件使用 EventSetter 来避免这种情况。但很明显,代码因您需要的所有包装标签而变得相当膨胀。

我的问题是是否有一些解决方法,这样您就不必处理EventSetters


编辑:请参阅this question,了解为什么会出现此错误。

【问题讨论】:

    标签: wpf events xaml styles setter


    【解决方案1】:

    您可以将ContextMenu 放在ListView 的资源中,然后将其用作静态资源,这样您就不必为MenuItem 使用样式

    <ListView ...>
        <ListView.Resources>
            <ContextMenu x:Key="listViewContextMenu">
                <MenuItem Header="Header" Click="MenuItem_Click"/>
            </ContextMenu>
        </ListView.Resources>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="ContextMenu" Value="{StaticResource listViewContextMenu}"/>
            </Style>
        </ListView.ItemContainerStyle>
        <!--...-->
    </ListView>
    

    【讨论】:

      【解决方案2】:

      您可以将ListBoxItem.HorizontalContentAlignment 改为Stretch,然后将ContextMenu 放入您的ListBox.ItemTemplate。这是一个例子:

      <Grid>
          <Grid.Resources>
              <PointCollection x:Key="sampleData">
                  <Point X="10" Y="20"/>
                  <Point X="30" Y="40"/>
              </PointCollection>
          </Grid.Resources>
          <ListBox Width="100" ItemsSource="{StaticResource sampleData}">
              <ListBox.ItemContainerStyle>
                  <Style TargetType="ListBoxItem">
                      <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                  </Style>
              </ListBox.ItemContainerStyle>
              <ListBox.ItemTemplate>
                  <DataTemplate>
                      <Grid Background="Red">
                          <Grid.ContextMenu>
                              <ContextMenu>
                                  <MenuItem Header="Test" Click="MenuItem_Click"/>
                              </ContextMenu>
                          </Grid.ContextMenu>
                          <TextBlock Text="{Binding}"/>
                      </Grid>
                  </DataTemplate>
              </ListBox.ItemTemplate>
          </ListBox>
      </Grid>
      

      【讨论】:

      • 对不起,问题是 ListBox,我忽略了它实际上是 ListView 的其他提示。
      • 哇哦,你说得对,ListBox一共写了三遍,只是复制后没把代码弄乱,不好意思。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2020-02-01
      • 1970-01-01
      • 2018-04-03
      • 2013-05-08
      • 1970-01-01
      • 2016-05-13
      相关资源
      最近更新 更多