Отображение всплывающей подсказки для ComboBoxItem - работает после перемещения мыши, но не с первой попытки - PullRequest
0 голосов
/ 08 февраля 2019

Я использую WPF ComboBox только с двумя элементами в Combobox.Я отображаю всплывающую подсказку для каждого ComboboxItem, сравнивая item.Content со свойством, которое включает в себя один класс, например:

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

XAML для вызова метода mentiod:

<ComboBox.ItemContainerStyle >
    <Style TargetType="{x:Type ComboBoxItem}">
        <EventSetter Event="MouseMove"  Handler="OnMouseHover"/>
    </Style>
</ComboBox.ItemContainerStyle>

Для MouseMove и MouseLeave работают, как указано.Для GotFocus проблема в isEditable=True - к сожалению, фокус остается на TextBlock.

ComboBox в 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>

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Поведение логически имхо.Сначала у вас нет ToolTip для ComboBoxItem, в первый раз MouseMove ToolTip устанавливается, но уже слишком поздно для его запуска ToolTip (кажется, ToolTip сработало раньше, чем MouseMove для ComboBoxItem быть уволенным).Таким образом, вы можете видеть 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 в объекте, которое является DataContext для ComboBoxItem и связать его:

<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();
}
0 голосов
/ 08 февраля 2019

Я думаю, что лучше использовать ToolTipOpening из класса ComboBox, чем OnMouseHover.Оформите решение:

        <ComboBox>
            <ComboBoxItem ToolTip="" ToolTipOpening="ComboBox_OnToolTipOpening">13.42</ComboBoxItem>
            <ComboBoxItem ToolTip="" ToolTipOpening="ComboBox_OnToolTipOpening">15.82</ComboBoxItem>
        </ComboBox>

А теперь код для манипуляции с подсказками:

        private void ComboBox_OnToolTipOpening(object sender, ToolTipEventArgs e)
        {
            ComboBoxItem item = sender as ComboBoxItem;

            if (item.Content.Equals("13.42"))
            {
                item.ToolTip = "ToolTipItem1";
            }
            else if (item.Content.Equals("15.82"))
            {
                item.ToolTip = "ToolTipItem2";
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...