Как я могу установить другой Текст всплывающей подсказки для каждого объекта в поле списка?

Я понимаю разочарование OPs, это использование виртуального не для шаблонной абстракции, для которой эффективный виртуальный модификатор defacto эффективен.

Если кто-то все еще борется с этим, я бы предложил свою точку зрения, поскольку я стараюсь, чтобы простые решения и жаргон были минимальными:

Entity Framework в простой части использует ленивую загрузку, что эквивалентно подготовке чего-то для будущего исполнения.

В Entity Framework использование свойства виртуальной навигации позволяет вам обозначить его как эквивалент NULL-ключа в SQL. Вы не должны с радостью присоединяться к каждой таблице с ключами при выполнении запроса, но когда вам нужна информация, она становится ориентированной на спрос.

Я также упомянул об ошибке, поскольку многие свойства навигации не актуальны в первую очередь. т. е. в сценарии «клиент / заказ» вам не нужно ждать момента, когда заказ будет обработан для создания клиента. Вы можете, но если у вас был многоэтапный процесс для достижения этого, вы можете обнаружить необходимость сохранения данных клиента для последующего завершения или для развертывания в будущих заказах. Если были реализованы все свойства nav, вам нужно будет установить каждый внешний ключ и реляционное поле в файле save. Это действительно просто возвращает данные в память, что наносит ущерб роли настойчивости.

Итак, хотя это может показаться загадочным в фактическом выполнении во время выполнения, я нашел, что лучшим правилом для использования будет: если вы выводите данные (чтение в модель просмотра или модель Serializable) и нужны значения перед ссылками, не используйте виртуальные; Если ваша область данных собирает данные, которые могут быть неполными или необходимость поиска и не требует, чтобы каждый параметр поиска был завершен для поиска, код будет хорошо использовать ссылку, аналогичную использованию свойств значения nullable value int? длинный?. Кроме того, абстрагирование вашей бизнес-логики из вашей коллекции данных до тех пор, пока она не будет введена в нее, имеет много преимуществ в производительности, аналогично созданию экземпляра объекта и его запуску при нулевом значении. Entity Framework использует много отражения и динамики, которые могут ухудшить производительность, и необходимость иметь гибкую модель, которая может масштабироваться для обеспечения, имеет решающее значение для управления производительностью.

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

23
задан efotinis 22 November 2008 в 13:49
поделиться

4 ответа

Существует две основных подпроблемы, которые нужно решить для решения этой проблемы:

  1. Определяют, какой объект колеблется по
  2. , Заставляют событие MouseHover стрелять, когда пользователь навис над одним объектом, затем переместил курсор в поле списка и навис над другим объектом.

первая проблема довольно проста решить. Путем вызова метода как следующее в обработчике для MouseHover можно определить, какой объект колеблется:

private ITypeOfObjectsBoundToListBox DetermineHoveredItem()
{
    Point screenPosition = ListBox.MousePosition;
    Point listBoxClientAreaPosition = listBox.PointToClient(screenPosition);

    int hoveredIndex = listBox.IndexFromPoint(listBoxClientAreaPosition);
    if (hoveredIndex != -1)
    {
        return listBox.Items[hoveredIndex] as ITypeOfObjectsBoundToListBox;
    }
    else
    {
        return null;
    }
}

Тогда используют возвращенное значение для установки подсказки по мере необходимости.

вторая проблема состоит в том, что обычно событие MouseHover не запущено снова, пока курсор не оставил клиентскую область управления и затем возвратился.

можно обойти это путем обертывания TrackMouseEvent вызов Win32API.
В следующем коде, ResetMouseHover метод обертывает вызов API для получения желаемого эффекта: сбросьте базовый таймер, который управляет, когда событие при наведении курсора запущено.

public static class MouseInput
{
    // TME_HOVER
    // The caller wants hover notification. Notification is delivered as a 
    // WM_MOUSEHOVER message.  If the caller requests hover tracking while 
    // hover tracking is already active, the hover timer will be reset.

    private const int TME_HOVER = 0x1;

    private struct TRACKMOUSEEVENT
    {
        // Size of the structure - calculated in the constructor
        public int cbSize;

        // value that we'll set to specify we want to start over Mouse Hover and get
        // notification when the hover has happened
        public int dwFlags;

        // Handle to what's interested in the event
        public IntPtr hwndTrack;

        // How long it takes for a hover to occur
        public int dwHoverTime;

        // Setting things up specifically for a simple reset
        public TRACKMOUSEEVENT(IntPtr hWnd)
        {
            this.cbSize = Marshal.SizeOf(typeof(TRACKMOUSEEVENT));
            this.hwndTrack = hWnd;
            this.dwHoverTime = SystemInformation.MouseHoverTime;
            this.dwFlags = TME_HOVER;
        }
    }

    // Declaration of the Win32API function
    [DllImport("user32")]
    private static extern bool TrackMouseEvent(ref TRACKMOUSEEVENT lpEventTrack);

    public static void ResetMouseHover(IntPtr windowTrackingMouseHandle)
    {
        // Set up the parameter collection for the API call so that the appropriate
        // control fires the event
        TRACKMOUSEEVENT parameterBag = new TRACKMOUSEEVENT(windowTrackingMouseHandle);

        // The actual API call
        TrackMouseEvent(ref parameterBag);
    }
}

С оберткой на месте, можно просто звонить ResetMouseHover(listBox.Handle) в конце обработчика MouseHover, и событие при наведении курсора будет стрелять снова, даже когда курсор остается в границах управления.

я уверен, что этот подход, засовывая весь код в обработчик MouseHover должен привести к большему количеству событий MouseHover, стреляющих, чем действительно необходимы, но это сделает задание. Любые улучшения являются больше, чем приветствие.

20
ответ дан Jimi 29 November 2019 в 02:04
поделиться

I think the best option, since your databinding your listbox to objects, would be to use a datatemplate. So you could do something like this:

<ListBox Width="400" Margin="10" 
         ItemsSource="{Binding Source={StaticResource myTodoList}}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=TaskName}" 
                       ToolTipService.ToolTip="{Binding Path=TaskName}"/>
        </DataTemplate>
     </ListBox.ItemTemplate>
</ListBox>

Of course you'd replace the ItemsSource binding with whatever your binding source is, and the binding Path parts with whatever public property of the objects in the list you actually want to display. More details available on msdn

6
ответ дан 29 November 2019 в 02:04
поделиться

Используя атрибут title, мы можем установить всплывающую подсказку для каждого элемента списка в окне списка.

Выполните цикл для всех элементов в окне списка.

ListItem li = new ListItem("text","key");
li.Attributes.Add("title","tool tip text");

Надеюсь, это поможет.

0
ответ дан 29 November 2019 в 02:04
поделиться

Вот стиль, который создает группу RadioButton с помощью ListBox. Все привязано для MVVM-инжиниринга. MyClass содержит два свойства String: MyName и MyToolTip. Это позволит отобразить список RadioButton, включая соответствующую ToolTip-подсказку. Интерес для этой темы представляет сеттер для ToolTip в нижней части, что делает это решение полностью Xaml-решением.

Пример использования:

ListBox Style="{StaticResource radioListBox}" ItemsSource="{Binding MyClass}" SelectedValue="{Binding SelectedMyClass}"/>

Стиль:

    <Style x:Key="radioListBox" TargetType="ListBox" BasedOn="{StaticResource {x:Type ListBox}}">
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="Margin" Value="5" />
    <Setter Property="Background" Value="{x:Null}" />
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Grid Background="Transparent">
                                <RadioButton Focusable="False" IsHitTestVisible="False" IsChecked="{TemplateBinding IsSelected}" Content="{Binding MyName}"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="ToolTip" Value="{Binding MyToolTip}" />
            </Style>
        </Setter.Value>
    </Setter>
</Style>
0
ответ дан 29 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: