none
Подсказка для listbox в зависимости от того на какой строке курсор RRS feed

  • Вопрос

  • Как получить элемент списка, на котором находится курсор?

    Например есть список файлов, в подсказке (tooltip) хочу выводить какую-то инфу по файлу.

    Есть метод GetChildAtCursor(), как его (и его ли) надо заюзать?

    c# желательно


    В.Катаев
    21 апреля 2011 г. 17:02

Ответы

  • В общем-то и так все видно. Как должно быть по хорошему:

    1. нужно использовать объекты, а не списки со списками непонятно чего, вы же пишете на C#.

    public class Document
    {
        public string Title { get; set; }//Заголовок документа
        public string Description { get; set; } // Описание документа
    }
    


    2. lstbx.ItemsSource = documents;//documents - это IList<Document> или любая другая коллекция, но документов

    3. в листбоксе нужно прописать DisplayMemberPath="Title".

    4. для того, чтобы описание документа показывалось в тултипе, пишете:

    <Style TargetType="ListBoxItem">
        <Setter Property="ToolTip" Value="{Binding Description}" />
    </Style>
    
    
    


    • Предложено в качестве ответа elp87 10 января 2013 г. 6:55
    • Помечено в качестве ответа Abolmasov Dmitry 10 января 2013 г. 8:04
    21 октября 2011 г. 12:52
    Отвечающий
  • В WPF вы можете в ToolTip вставить что угодно.

    В WinForms вот пример: http://stackoverflow.com/questions/192584/how-can-i-set-different-tooltip-text-for-each-item-in-a-listbox

    • Предложено в качестве ответа Abolmasov Dmitry 22 апреля 2011 г. 9:42
    • Помечено в качестве ответа Abolmasov Dmitry 22 апреля 2011 г. 9:55
    21 апреля 2011 г. 17:57
    Отвечающий
  • Из предложенного примера, но без вызова API, все в обработчике движения мыши, нужно только проверять не установлено ли уже данное значение подсказки, чтобы избежать мерцания

     

     

    private void listBox2_MouseMove(object sender, MouseEventArgs e)

    {

    Point screenPosition = ListBox.MousePosition;

     Point listBoxClientAreaPosition = listBox2.PointToClient(screenPosition);

     

    int hoveredIndex = listBox2.IndexFromPoint(listBoxClientAreaPosition);

     

    if ((hoveredIndex != -1) && (toolTip1.GetToolTip(listBox2) != listBox2.Items[hoveredIndex].ToString()))

    {

    toolTip1.SetToolTip(listBox2, listBox2.Items[hoveredIndex].ToString());

    }

    }


    В.Катаев
     

     

     

     

    22 апреля 2011 г. 9:15

Все ответы

  • В WPF вы можете в ToolTip вставить что угодно.

    В WinForms вот пример: http://stackoverflow.com/questions/192584/how-can-i-set-different-tooltip-text-for-each-item-in-a-listbox

    • Предложено в качестве ответа Abolmasov Dmitry 22 апреля 2011 г. 9:42
    • Помечено в качестве ответа Abolmasov Dmitry 22 апреля 2011 г. 9:55
    21 апреля 2011 г. 17:57
    Отвечающий
  • Из предложенного примера, но без вызова API, все в обработчике движения мыши, нужно только проверять не установлено ли уже данное значение подсказки, чтобы избежать мерцания

     

     

    private void listBox2_MouseMove(object sender, MouseEventArgs e)

    {

    Point screenPosition = ListBox.MousePosition;

     Point listBoxClientAreaPosition = listBox2.PointToClient(screenPosition);

     

    int hoveredIndex = listBox2.IndexFromPoint(listBoxClientAreaPosition);

     

    if ((hoveredIndex != -1) && (toolTip1.GetToolTip(listBox2) != listBox2.Items[hoveredIndex].ToString()))

    {

    toolTip1.SetToolTip(listBox2, listBox2.Items[hoveredIndex].ToString());

    }

    }


    В.Катаев
     

     

     

     

    22 апреля 2011 г. 9:15
  • Если проблема решена - то не забывайте отмечать сообщения, решившие проблему. Для этого под каждым сообщением есть кнопка "Пометить как ответ". Спасибо.


    Для связи [mail]
    22 апреля 2011 г. 9:42
  • Кто-нибудь подскажите пожалуйста откуда найти .MousePosition? (студия говорит:'System.Windows.Controls.ListBox' does not contain a definition for 'MousePosition')

    и как да куда вставлять toolTip1 из вышенаписанного примера?

    Спасибо

    20 октября 2011 г. 11:09
  • У вас же WPF, пользуйтесь тем что он предлагает, а он предлагает просто вставлять в ToolTip что захотите.

    Тот пример для WinForms.

    21 октября 2011 г. 8:47
    Отвечающий
  • Так ведь ToolTip один для всех в ListBox-е?

    А мне надо чтобы для каждого элемента высвечивалась своя подсказка.

    21 октября 2011 г. 10:12
  • В листбоксе для каждого элемента можно указать тултип. Пусть у вас в каждом элементе списка есть поле ToolTipText, тогда:

    <Style TargetType="ListBoxItem">
        <Setter Property="ToolTip" Value="{Binding ToolTipText}" />
    </Style>
    

    Вот так можно определить тултип. при желании, можно определить и стиль для тултипа и вставлять туда и заголовок, и картинку, и текст, и много ещё чего.

    21 октября 2011 г. 10:58
    Отвечающий
  • Извините за глупый вопрос, а что это за поле ToolTipText? Оно создается или определяется или как?
    21 октября 2011 г. 11:23
  • Это поле в котором вы храните текст для тултипов. Оно находится в классе, элементы которого вы показываете в листбоксе. В общем-то, как его определите, так оно и будет называться :)
    21 октября 2011 г. 11:31
    Отвечающий
  • Любите вы говорить загадками:)  Покажите пожалуйста код
    21 октября 2011 г. 11:38
  • Лучше вы свой :) Может тогда станет ясно почему я говорю загадками ))) Запостите сюда XAML листбокса и то, как вы его заполняете.
    21 октября 2011 г. 12:00
    Отвечающий
  • пожалуйста <Window x:Class="E_Book_template_2._0.Book" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Book" Height="300" Width="763" WindowState="Maximized" WindowStyle="None"> <Window.Resources> <Style TargetType="ListBoxItem"> <Setter Property="ToolTip" Value="{Binding ToolTipText}" /> </Style> </Window.Resources> <Window.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="Black" Offset="0"/> <GradientStop Color="White" Offset="1"/> </LinearGradientBrush> </Window.Background> <Grid x:Name="LayoutRoot"> <Grid.Background> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF34709F" Offset="0"/> <GradientStop Color="#FF53A3D8" Offset="1"/> <GradientStop Color="#FF9DC2DE" Offset="0.086"/> <GradientStop Color="#FFBCD0DF" Offset="0.674"/> <GradientStop Color="#FFE5EDF2" Offset="0.876"/> <GradientStop Color="#FFD0E6F7" Offset="0.129"/> <GradientStop Color="#FFF5F8FA" Offset="0.957"/> </LinearGradientBrush> </Grid.Background> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.03*"/> <ColumnDefinition/> <ColumnDefinition Width="0.03*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="0.01*"/> <RowDefinition Height="0.05*"/> <RowDefinition/> <RowDefinition Height="0.03*"/> <RowDefinition Height="0.03*"/> <RowDefinition Height="0.01*"/> </Grid.RowDefinitions> <DockPanel Grid.Column="1" Grid.Row="2"> <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" HorizontalAlignment="Center"> <Expander Name="expander1" Header="Темы" VerticalAlignment="Top" ExpandDirection="Down" HorizontalAlignment="Center" HorizontalContentAlignment="Center" HeaderStringFormat="Bold" Foreground="#FF0A5596" FontSize="12" FontWeight="Bold"> <Grid> <ListBox Name="lstbx" MaxWidth="150" SelectionChanged="lstbx_SelectionChanged" Foreground="#FF1C4C55" Background="{x:Null}"> </ListBox> </Grid> </Expander> ... </StackPanel> ... </Grid> </Window> private void OpenBase(string path) { docArray = new ByteArray(); docArray.Open(path); lstbx.SelectedIndex = 0; lstbx.ItemsSource = docArray.titles; } public class ByteArray { public List<Element> docs = new List<Element>(); public List<string> titles = new List<string>(); ... } [Serializable] public class Element { public byte[] el = null; }
    21 октября 2011 г. 12:12
  • извините за беспорядок, дома слабый инет. Завтра с работы заново отправлю
    21 октября 2011 г. 12:15
  • В общем-то и так все видно. Как должно быть по хорошему:

    1. нужно использовать объекты, а не списки со списками непонятно чего, вы же пишете на C#.

    public class Document
    {
        public string Title { get; set; }//Заголовок документа
        public string Description { get; set; } // Описание документа
    }
    


    2. lstbx.ItemsSource = documents;//documents - это IList<Document> или любая другая коллекция, но документов

    3. в листбоксе нужно прописать DisplayMemberPath="Title".

    4. для того, чтобы описание документа показывалось в тултипе, пишете:

    <Style TargetType="ListBoxItem">
        <Setter Property="ToolTip" Value="{Binding Description}" />
    </Style>
    
    
    


    • Предложено в качестве ответа elp87 10 января 2013 г. 6:55
    • Помечено в качестве ответа Abolmasov Dmitry 10 января 2013 г. 8:04
    21 октября 2011 г. 12:52
    Отвечающий
  • 1. нужно использовать объекты, а не списки со списками непонятно чего, вы же пишете на C#.


    хорошо что я весь код не показал.

    Ну теперь я понял. Спасибо Anton.Maksimov

    22 октября 2011 г. 2:10