gpt4 book ai didi

c# - 如何正确使用列表框项目模板/数据模板中的按钮?

转载 作者:太空狗 更新时间:2023-10-29 23:51:54 25 4
gpt4 key购买 nike

我有一个 Silverlight 应用程序,它在 ListBox 中显示项目列表。每个项目代表我的应用程序的不同“页面”,因此我有一个应用于 ItemContainerStyle 属性的样式,如下所示:

<Style x:Key="navigationItemContainerStyle" TargetType="ListBoxItem">
<Setter Property="Margin" Value="5,3"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid Cursor="Hand">
<VisualStateManager.VisualStateGroups>
<!-- code omitted --!>
</VisualStateManager.VisualStateGroups>
<Border x:Name="contentBorder"
Background="{StaticResource navigationHighlightBrush}"
CornerRadius="3"
Opacity="0"/>
<ContentControl x:Name="content"
Margin="10,5"
Content="{Binding}"
Foreground="DarkGray"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

风格很简单。当 ListBoxItem 的视觉状态等于“已选择”时,它只显示 Border。请注意,内容由 ContentControl 托管,因为我希望能够在项目处于“已选择”状态时更改 Foreground 属性。

从下面的屏幕截图可以看出,这非常有效:

enter image description here

现在我希望选定的项目调用导航,所以我的想法是创建一个 DataTemplate,将每个项目的内容设置为 HyperLinkBut​​ton:

<DataTemplate x:Key="navigationListBoxItemTemplate">
<HyperlinkButton Content="{Binding}"
Background="Transparent"/>
</DataTemplate>

现在这不起作用,因为 ItemTemplate 将其内容托管在 ContentControl 而不是 ContentPresenter 中,所以我不得不更新ListBoxItem 模板以使用 ContentPresenter 代替。

<ContentPresenter x:Name="content" Margin="10,5"/>

我现在得到以下结果:

enter image description here

当我点击 HyperLinkBut​​ton 时,ListBoxItem 现在不再被选中(我可以点击 HyperLinkBut​​ton ListBoxItem 变为选中状态)。我真正想要的是在单击 HyperLinkBut​​ton 时选择 ListBoxItemHyperLinkBut​​ton 没有选择的概念,所以我无法绑定(bind)到 ListBoxItemIsSelected 属性。

注意:实际导航工作完美,问题完全在于 ListBoxItems 的外观。

所以我的问题是:

  1. 我能否做到在单击 HyperLinkBut​​ton 时,ListBoxItem 像第一张图片一样被选中?
  2. 我还需要一些方法来更改 HyperLinkBut​​ton 被选中时的前景,因为由于我交换了 ContentControl,项目模板中不再这样做来自 ContentPresenter

注意:我可以通过将 ListBoxSelectedItem 属性绑定(bind)到我的 viewModel 并在那里处理导航来解决这个问题要求每个 ListBoxItem 都有一个 HyperLinkBut​​ton,但我想知道是否可以使用样式和模板来实现我想要的结果。

更新

我已经尝试了一些方法来尝试解决这个问题,但到目前为止都没有成功。我尝试的第一件事是对我的 DataTemplate 中的 HyperLinkBut​​ton 控件应用一种新样式,这基本上从控件中删除了所有默认外观,但我的应用程序仍然表现在上述方法。

我尝试的第二件事是将 IsHitTestVisible 属性设置为 false。这允许我单击“通过”HyperLinkbutton 并选择 ListBoxItem,但这意味着现在不再调用导航。

最佳答案

ListBoxItem 未被选中,因为 Button(无论它是什么类型)将 MouseLeftButtonDown 事件标记为已处理。因此,所需的事件不会冒泡到父 ListBoxItem。

显然,您的 ListBoxItem 正在通过点击获得焦点(我假设这是您最终图像中的边框),因此无论如何这都必须发生。

在幕后,ListBoxItem 将设置一个标准的 LeftMouseButtonDown 事件处理程序来处理选择,并且它必须调用 AddHandler 来处理设置焦点。


您可以通过为事件添加自己的处理程序来实现类似的效果,如下所示:

 listboxitem.AddHandler(UIElement.MouseLeftButtonDownEvent, new System.Windows.Input.MouseButtonEventHandler(MyMouseLeftButtonDownEventHandler), true);

最后一个参数指示处理程序处理已处理的事件...

附加这个处理程序我留给你,但使用行为可能是最直接的。您甚至可以从 Button 派生一个类型,并让它沿着可视化树向上移动以查找并选择 ListBoxItem...可能性是无限的。

关于c# - 如何正确使用列表框项目模板/数据模板中的按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14215460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com