Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > ToolTip ListBox


Автор: Bladerender 24.1.2011, 23:55
В общем такая задача. Есть ListBox с текстом. Задался вопросом, как показывать свой ToolTip, когда я брожу мышкой по тексту в ListBox. При этом ToolTip должен менять свою позицию и текст.

Подписался в ListBox на событие MouseMove() и пытаюсь там шаманить (в WinForms никогда проблем небыло)


Код

private void sourceCode_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
        {
            // То что хочу отображать
            System.Windows.Forms.ToolTip d = new ToolTip();

            //типа хочу получить окно IWin32Window
            IntPtr handle = new WindowInteropHelper(this).Handle;
            
             Point point = e.GetPosition(this.sourceCode));

            //показываю
            d.Show("bla-bla-bla", handle, point);
       
        }


собственно проблем 2. Второй и третий параметр неправильные. Точнее я не могу добыть из handle окно IWin32Window и не могу правильно достать point. Не то передаю. Что-то я или туплю или есть разительная разница WPF и WinForms в работе в таких ситуациях.

Автор: vikaz 25.1.2011, 06:58
У меня сразу возникло несколько вопросов.
1. Почему Вы используете  System.Windows.Forms.ToolTip. Ведь у WPF есть свой ToolTip?
2. Почему Вы создаете новый объект ToolTip в MouseMove ? Ведь при перемещении мыши будет создавать шлейф из объектов ToolTip, при этом Вы их нигде не прячите.



Автор: Rohoss 25.1.2011, 13:18
Так можно сделать с кода
Код

            ListBox lbx = new ListBox();
            ListBoxItem lbi = new ListBoxItem();
            TextBox txt = new TextBox();
            txt.Text = "My Text";
            lbi.ToolTip = txt;
            lbx.Add(lbi);


ToolTip, как говорил vikaz, нужно использовать из WPF. Но вы просто можете добавить в свойство ToolTip любой элемент управления WPF, если вас устраивает поведение тоолтипа по умолчанию, если же нет, то можно создать отдельно:
Код

            ListBox lbx = new ListBox();
            ListBoxItem lbi = new ListBoxItem();

            TextBox txt = new TextBox();
            txt.Text = "My Text";

            ToolTip tt = new System.Windows.Controls.ToolTip();
            tt.Content = txt;
            //Например, делаем так, чтобы наш тултип отбрасывал тень
            tt.HasDropShadow = true;
            
            lbi.ToolTip = tt;
            lbx.Add(lbi);

Автор: Bladerender 25.1.2011, 23:55
Я понимаю, что ToolTip можно подвязать к контролу. Но с обычной подвязкой проблема. Они когда хотят появляются. То появляются, то нет. Если мышку убрать с контрола и быстро вернуть обратно, то он уже не появится (зачастую). Вот потому я и хочу сделать его отображение вручную. 
Для того что бы List не путал ситуацию, пускай это будет обычный TextBox.  Я никогда не буду выводить мышку за пределы этого TextBox. Как мне этот тулТип постоянно отображать в той позиции, где у меня сейчас мышка на этом TextBox? В System.Windows.Controls.ToolTip  я вообще не нашел метод Show();
Шлейф из тултипов пускай не смущает. Как раз что-то типа шлейфа я и хочу сделать. Это уже мои заморочки. Мне хотя бы один показать, созданный мной и отображенный типа методом Show() в старом добром WinForms.

Автор: Rohoss 26.1.2011, 00:54
Цитата(Bladerender @  25.1.2011,  23:55 Найти цитируемый пост)
 Они когда хотят появляются. То появляются, то нет. Если мышку убрать с контрола и быстро вернуть обратно, то он уже не появится (зачастую). Вот потому я и хочу сделать его отображение вручную. 


Bladerender, всё предусмотрено, используй класс ToolTipService

Код

            ListBox lbx = new ListBox();
            ListBoxItem lbi = new ListBoxItem();
            TextBox txt = new TextBox();
            txt.Text = "My Text";
            ToolTip tt = new System.Windows.Controls.ToolTip();
            tt.Content = txt;
            //Например, делаем так, чтобы наш тултип отбрасывал тень
            tt.HasDropShadow = true;
            
            //Продолжительность. Можно задать очень большое число, и тогда он будет видим всегда
            ToolTipService.SetShowDuration(tt, 10000000);
            //Через какое время тултип появится
            ToolTipService.SetInitialShowDelay(tt, 1000);

            lbi.ToolTip = tt;
            lbx.Add(lbi);


А ещё можно копнуть в сторону элемента Popup

Автор: Bladerender 26.1.2011, 11:54
Заменил PopUp. Намного удобнее с ним работать. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)