powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Image Tooltip
13 сообщений из 13, страница 1 из 1
Image Tooltip
    #38881712
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как отобразить Tooltip у нарисованного элемента?

Рисую так и пробовал добавлять Tooltip, но так не работает:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
            Rect rect = new Rect(x, y, 24, 24);

            TextBlock textBlock = new TextBlock();
            textBlock.Foreground = Brushes.White;
            textBlock.HorizontalAlignment = HorizontalAlignment.Center;
            textBlock.VerticalAlignment = VerticalAlignment.Center;
            textBlock.Text = "Image Text";

            Grid toolTipPanel = new Grid();
            toolTipPanel.Children.Add(textBlock);
            ToolTipService.SetToolTip(image, toolTipPanel);

            context.DrawImage(image, rect);
...
Рейтинг: 0 / 0
Image Tooltip
    #38881714
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
      BitmapImage image = new BitmapImage(new Uri(String.Format("pack://application:,,,/Astro;component/Images/{0}.png", name)));
...
Рейтинг: 0 / 0
Image Tooltip
    #38881819
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так. тултип появляется, но он очень маленький, не по размеру текста.
Что не так?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
TextBlock textBlock = new TextBlock();
            textBlock.Foreground = Brushes.White;
            textBlock.HorizontalAlignment = HorizontalAlignment.Center;
            textBlock.VerticalAlignment = VerticalAlignment.Center;
            textBlock.Text = "Image Text";
            Size s = Helper.MeasureString(textBlock.FontFamily, textBlock.FontSize, "Image Text");
            textBlock.Width = s.Width;
            textBlock.Height = s.Height;

            Grid toolTipPanel = new Grid();
            toolTipPanel.HorizontalAlignment = HorizontalAlignment.Stretch;
            toolTipPanel.VerticalAlignment = VerticalAlignment.Stretch;
            toolTipPanel.Width = s.Width;
            toolTipPanel.Height = s.Height;
            toolTipPanel.Children.Add(textBlock);

            BitmapImage image = new BitmapImage(new Uri(String.Format("pack://application:,,,/Astro;component/Images/{0}.png", "Aries")));
            Image img = new Image();
            img.Height = 24;
            img.Width = 24;
            img.Source = image;
            img.SetValue(Canvas.LeftProperty, 200.0);
            img.SetValue(Canvas.TopProperty, 200.0);
            ToolTipService.SetToolTip(img, toolTipPanel);

            this.Children.Add(img);
...
Рейтинг: 0 / 0
Image Tooltip
    #38881972
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня только 1 вопрос, зачем всё это делать императивно, если можно декларативно?
...
Рейтинг: 0 / 0
Image Tooltip
    #38882011
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Любой вариант подойдет.
У меня есть контрол:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    public class Zodiac: UserControl
    {
        public static readonly DependencyProperty RadiusProperty = DependencyProperty.Register("Radius", typeof(double), typeof(Zodiac),
            new FrameworkPropertyMetadata(0.0));

        public double Radius
        {
            get { return (double)GetValue(RadiusProperty); }
            set { SetValue(RadiusProperty, value); }
        }

        public Zodiac()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(Zodiac), new FrameworkPropertyMetadata(typeof(Zodiac)));
        }
    }



Для него есть Template.

В этом Template есть:

Код: c#
1.
2.
3.
4.
<local:PlanetCircle Panel.ZIndex="2" CentreX="{Binding Path=Radius}" CentreY="{Binding Path=Radius}" 
                                                Radius="{Binding Path=Radius, Converter={StaticResource SizeConverter2}}" 
                                                Rotation="{Binding Path=House1}"
                                                Planets="{Binding Path=Planets}"/>



PlanetCircle это Canvas. В нем я рисую много объектов
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
protected override void OnRender(DrawingContext context)
        {
            base.OnRender(context);

            Pen pen = new Pen((SolidColorBrush)(new BrushConverter().ConvertFrom("#a4c8f0")), 1.0);

            context.DrawEllipse(Brushes.White, pen, new Point(CentreX, CentreY), Radius, Radius);

            int i = 0;
            var list = Planets as List<PlanetModel>;
            if (null != list)
            {
                foreach (var item in list)
                {
                    if (i > 9)
                        break;

                     BitmapImage image = new BitmapImage(new Uri(Helper.GetImage(i))));
                     Rect rect = new Rect(x, y, 24, 24);
                     context.DrawImage(image, rect);

                    i++;
                }
            }
        }



Для image мне нужно сделать тултип. Как я понял я могу его сделать 2 способами. Или добавлять контрол на мой Zodiac и у него уже делать тултип или обрабатывать движение мыши на канве, определять, что она на нужном объекте и показывать тултип.

С контролом пока не получается. Обработку мыши не пробовал пока.
...
Рейтинг: 0 / 0
Image Tooltip
    #38882053
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

вся ваша проблема в том, что вы их именно рисуете. Я бы сделал так:

PlanetCircle я бы наследовал от Panel или Canvas. 2 случай я бы использовал, бы мне нужно было выходить за рамки контрола.
в этом контроле я бы переопределил методоми MeasureOvveride и ArrangeOverride.
Планеты я бы сделал отдельным контролом со своими шаблоном и контнтом, который может быть произвольным. Проще говоря в Children я бы размещал любые UIElement'ы которые внутри PlanetCircle размещались бы и вращались на своих местах.
Так же в PlanetCircle создаем зависимые свойства CentreX, CentreY, Radius, Angle, указываем в опциях к свойства, что они влияют на Arrange (AffectsArrange).
Положением элементов в панели мы вычисляем задаем в методе ArrangeOverride, если нужно, чтоб каждый элемент нашей панели (каждая планета) летала на своей орбите со своей скоростью и другими коэффициентами, задаем их с помощью AttachedProperty для каждого элемента панели (будет не важно, кнопка это или картинка или грид) либо делаем обёртку с соответствующими свойствами.

После того как сделаете это, будет в 3 раза проще анимировать всё это. Планету уже будут не рисунками, а реальными объектами в которых вы разместите любой контент, картинки или кнопки, тултипы, хоть лысый х...

а вы просто рисуете их на контроле, соответственно, они у вас не интерактивны. Ну это не интересно! :)
...
Рейтинг: 0 / 0
Image Tooltip
    #38882672
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman MejtesPlanetCircle я бы наследовал от Panel или Canvas.

Так и есть, от Canvas

Roman Mejtes2 случай я бы использовал, бы мне нужно было выходить за рамки контрола.


Так и есть. Планеты должны быть за окружностью или тогда не выставлять размеры PlanetCircle и он будет в размер родителя.

Roman Mejtesв этом контроле я бы переопределил методоми MeasureOvveride и ArrangeOverride.


Этого пока не надо, сами планеты имеют фикс размер

Roman MejtesПланеты я бы сделал отдельным контролом со своими шаблоном и контнтом, который может быть произвольным.


Спасибо, попробую так сделать. Тоже кажется правильным подходом.

Roman MejtesТак же в PlanetCircle создаем зависимые свойства CentreX, CentreY, Radius, Angle, указываем в опциях к свойства, что они влияют на Arrange (AffectsArrange).


Они на AffectsRender повешены вот так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public static readonly DependencyProperty CentreXProperty = DependencyProperty.Register("CentreX", typeof(double), typeof(PlanetCircle),
            new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
        public static readonly DependencyProperty CentreYProperty = DependencyProperty.Register("CentreY", typeof(double), typeof(PlanetCircle),
            new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
        public static readonly DependencyProperty RadiusProperty = DependencyProperty.Register("Radius", typeof(double), typeof(PlanetCircle),
            new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
        public static readonly DependencyProperty RotationProperty = DependencyProperty.Register("Rotation", typeof(double), typeof(PlanetCircle),
            new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
        public static readonly DependencyProperty PlanetsProperty = DependencyProperty.Register("Planets", typeof(object), typeof(PlanetCircle),
            new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));




Roman MejtesПоложением элементов в панели мы вычисляем задаем в методе ArrangeOverride, если нужно, чтоб каждый элемент нашей панели (каждая планета) летала на своей орбите со своей скоростью и другими коэффициентами, задаем их с помощью AttachedProperty для каждого элемента панели (будет не важно, кнопка это или картинка или грид) либо делаем обёртку с соответствующими свойствами.

После того как сделаете это, будет в 3 раза проще анимировать всё это. Планету уже будут не рисунками, а реальными объектами в которых вы разместите любой контент, картинки или кнопки

А вот тут у меня вопрос, на который я пока не понял, как найти решение, но пробовал.
Количество планет произвольное. Где и когда их добавлять? Я понял, что в Render неправильно, потому что начинались тормоза и приходилось постоянно удалять старые объекты иначе добавлялось еще такое же количество.
...
Рейтинг: 0 / 0
Image Tooltip
    #38882679
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в этом контроле я бы переопределил методоми MeasureOvveride и ArrangeOverride.


Извиняюсь, надо
...
Рейтинг: 0 / 0
Image Tooltip
    #38882923
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если вы сделайте такой контрол, но количество планет произвольно и зависит от модели представления, тогда делать нужно след. образом:


Код: xml
1.
2.
3.
4.
5.
6.
7.
        <ItemsControl ItemsSource="{Binding List}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <PlanetCircle/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
...
Рейтинг: 0 / 0
Image Tooltip
    #38882980
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Не совсем так. PlanetCircle это как раз круг, где я еще рисую линии.
А вот на нем уже планеты, вернее вокруг него. Так вот количество этих планет произвольное.

Я пока сделал вот такой контрол:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public class PlanetUI : FrameworkElement
    {
        public static readonly DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(ImageSource), typeof(Zodiac),
                                                                            new FrameworkPropertyMetadata(0.0));
        public ImageSource Source
        {
            get { return (ImageSource)GetValue(SourceProperty); }
            set { SetValue(SourceProperty, value); }
        }


        static PlanetUI()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(PlanetUI), new FrameworkPropertyMetadata(typeof(PlanetUI)));
        }
    }



Вот этих объектов может быть много и вот их я хочу добавлять, как Child на PlanetCircle.
...
Рейтинг: 0 / 0
Image Tooltip
    #38882982
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

т.е. должно быть тогда так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
<PlanetCircle>
<ItemsControl ItemsSource="{Binding List}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <PlanetUI/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
<.PlanetCircle>
...
Рейтинг: 0 / 0
Image Tooltip
    #38883026
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

какой то у вас неправильный подход :)
если вам надо круг, вы в Render его рисуйте, а поверх размещенные контролы и линии куда нужно. Так как вы написали не получится.
А чтоб элементы были круглыми, можно задать ClipBound Gemotry
...
Рейтинг: 0 / 0
Image Tooltip
    #38883157
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Спасибо!

Сделал так, все теперь здорово отображается и с ToolTip проблем нет. Весь код отображения перенес в PlanetUI:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<ItemsControl Panel.ZIndex="3"  x:Name="icPlanets" ItemsSource="{Binding Planets}">
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                        <local:PlanetUI Data="{Binding}" 
                                                        CentreX="{Binding ElementName=icPlanets, Path=DataContext.Radius}" 
                                                        CentreY="{Binding ElementName=icPlanets, Path=DataContext.Radius}" 
                                                        Radius="{Binding ElementName=icPlanets, Path=DataContext.Radius, Converter={StaticResource SizeConverter2}}" 
                                                        Rotation="{Binding ElementName=icPlanets, Path=DataContext.House1}"/>
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                            </ItemsControl>
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Image Tooltip
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]