代码之家  ›  专栏  ›  技术社区  ›  Brad Leach

wpf-悬停在一个元素上会显示另一个元素中的内容

wpf
  •  3
  • Brad Leach  · 技术社区  · 16 年前

    我想达到一种效果,我可以将鼠标悬停在一个按钮上,让一个文本块更新它的内容(通过绑定)。为了使事情复杂化,按钮是在itemscontrol/datatemplate中定义的许多按钮之一。文本块不在项控件的范围内。

    问题的一些简化标记如下:

    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
      </Grid.RowDefinitions>
      <ItemsControl Grid.Row="0">
        <ItemsControl.ItemTemplate>
          <DataTemplate>
            <Button Content="{Binding Title}"
                    Command="{Binding Command}" />    
          </DataTemplate>
        </ItemsControl.ItemTemplate>
      </ItemsControl>
      <TextBlock x:Name="TitleTextBox" Grid.Row="1" />
    </Grid>
    

    在本例中,我可能希望将数据项的“title”属性绑定到textBlock的“text”属性。

    我想我想敲入按钮的Ismouseover,但我似乎无法正确连接。

    1 回复  |  直到 16 年前
        1
  •  4
  •   wekempf    16 年前

    我不相信你能在没有代码的情况下完成这个任务…但是,您不需要使用codebehind。一个“行为”就可以解决这个问题(无论是老派 attached behavior 或者更现代的 Blend Behavior )下面是使用附加行为修改后的标记的外观:

    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
      </Grid.RowDefinitions>
      <ItemsControl x:Name="Buttons" Grid.Row="0" ext:Hover.TrackChildItems="true">
        <ItemsControl.ItemTemplate>
          <DataTemplate>
            <Button Content="{Binding Title}"
                    Command="{Binding Command}" />
          </DataTemplate>
        </ItemsControl.ItemTemplate>
      </ItemsControl>
      <TextBlock x:Name="TitleTextBox"
                 Grid.Row="1"
                 Text="{Binding ElementName=Buttons, Path=ext:Hover.Item.Content}" />
    </Grid>
    

    这里,附加的行为“hover.trackchilditems”用于监视适当的鼠标事件,并将只读的“hover.item”附加属性设置为要悬停的控件。写下行为应该足够简单,并且留给你。

    编辑 :要为项设置事件处理程序,首先要做的是简单而明显的:迭代项属性中的项并添加处理程序。

    Mouse.AddMouseEnter(item, OnMouseEnter);
    

    对于静态内容来说,这很好,但是动态(在运行时添加和删除)内容将被忽略。因此,接下来必须跟踪对items属性的更改。

    ((INotifyCollectionChanged)Items).CollectionChanged += OnItemsChanged;
    

    在CollectionChanged处理程序中添加和删除项时,根据需要添加或删除鼠标事件处理程序。

    还有另一个解决方案。为此创建从itemscontrol派生的新hovertrackingitemscontrol。在此控件中,重写getContainerForItemOverride方法以返回新的hoverTrackingItem,该项处理mouseEnter/mouseLeave以通知父级hoverTrackingitemsControl。此解决方案可能更容易实现,尽管它确实需要专门的控件,而行为解决方案更通用,可以与任何itemscontrol类型(itemscontrol、listbox、comboBox等)一起使用。