我正在使用 WPF 组合框,组合框中只有两个项目。我通过将 item.Content
与一个类包含的属性进行比较来显示每个 ComboboxItem 的工具提示,如下所示:
private void OnMouseHover(object sender, MouseEventArgs e)
{
var lineSelected = (modelGPZ.GetLineWyList().FirstOrDefault(x => x.isSelected == true));
ComboBoxItem item = sender as ComboBoxItem;
if ((double)item.Content == lineSelected.LiniaWyComboBox[0])
{
item.ToolTip = "This is the first Item";
}
if((double)item.Content == lineSelected.LiniaWyComboBox[1])
{
item.ToolTip = "This is the second Item";
}
}
问题是,当我第一次打开 Combobox 时,我没有得到工具提示...很奇怪,因为在我调试它时会调用该方法。更奇怪的是,当我将鼠标悬停在一个项目上,然后悬停在另一个项目上,最后悬停在第一个项目上时……我的工具提示出现了……
我尝试将事件更改为 MouseEnter
,它甚至不调用方法以及我认为此类操作的其他相关事件。
MSDN ComboBox Class
用于调用 mentiod 方法的 XAML:
<ComboBox.ItemContainerStyle >
<Style TargetType="{x:Type ComboBoxItem}">
<EventSetter Event="MouseMove" Handler="OnMouseHover"/>
</Style>
</ComboBox.ItemContainerStyle>
MouseMove
和 MouseLeave
的工作方式如前所述。对于 GotFocus
,问题是 isEditable=True
- 不幸的是,焦点停留在 TextBlock 上。
MainWindows.xaml 中的组合框:
<DataGridTemplateColumn Header="PRĄD POJEMNOŚCIOWY [A]" HeaderStyle="{StaticResource PRAD_POJEMNOSCIOWY}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="PradPojemnosciowyComboBox"
ItemsSource="{Binding LiniaWyComboBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedItemComboBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsEditable="True"
IsReadOnly="False"
Text="{Binding Prad_pojemnosciowy, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsTextSearchEnabled="False"
IsSynchronizedWithCurrentItem="True"
PreviewKeyDown="PradPojemnosciowyComboBox_OnPreviewKeyDown">
<ComboBox.Style>
<Style TargetType="{x:Type ComboBox}">
<Style.Triggers>
<Trigger Property="SelectedValue" Value="{x:Null}">
<Setter Property="SelectedItem" Value="{Binding SelectedItemComboBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Trigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
<ComboBox.ItemContainerStyle >
<Style TargetType="{x:Type ComboBoxItem}">
<EventSetter Event="GotFocus" Handler="PradPojemnosciowyComboBox_GotFocus"/>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
最佳答案
这种行为在逻辑上是恕我直言。首先你没有 ComboBoxItem
的 ToolTip
,第一次 MouseMove
ToolTip
被设置,但是已经太晚了触发它 ToolTip
(对于 ComboBoxItem
而言,ToolTip
似乎比 MouseMove
更早触发)。因此您只能在第二次输入该项目时看到 ToolTip
。
将所有内容附加到 GotFocus
,它将按预期工作:
<ComboBox.ItemContainerStyle >
<Style TargetType="{x:Type ComboBoxItem}">
<EventSetter Event="GotFocus" Handler="ComboBoxItem_GotFocus"/>
</Style>
</ComboBox.ItemContainerStyle>
private void ComboBoxItem_GotFocus(object sender, RoutedEventArgs e)
{
var lineSelected = (modelGPZ.GetLineWyList().FirstOrDefault(x => x.isSelected == true));
ComboBoxItem item = sender as ComboBoxItem;
if ((double)item.Content == lineSelected.LiniaWyComboBox[0])
{
item.ToolTip = "This is the first Item";
}
if ((double)item.Content == lineSelected.LiniaWyComboBox[1])
{
item.ToolTip = "This is the second Item";
}
}
更好的方法是在 ViewModel 对象中创建一个属性 ItemToolTip
,它是 ComboBoxItem
的 DataContext 并绑定(bind)它:
<ComboBox.ItemContainerStyle >
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="ToolTip">
<Setter.Value>
<ToolTip Content="{Binding ItemToolTip}"/>
</Setter.Value>
</Setter>
</Style>
</ComboBox.ItemContainerStyle>
示例如何在 ViewModel 中准备数据:
public List<object> CbxItemsSource { get; set; } = InitCbxSource();
private static List<object> InitCbxSource()
{
var dblLst = new List<double>() { 1, 2, 3 };
return dblLst.Select(dbl => (object)new { ItemValue = dbl, ItemToolTip = "e.g. item index " + dblLst.IndexOf(dbl)}).ToList();
}
关于c# - 显示 ComboBoxItem 的工具提示 - 移动鼠标后有效,但不是第一次尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54588156/