[C#] Wie kann ich für jedes Element in einem Listenfeld einen anderen Tooltip-Text festlegen?


Answers

Mithilfe des MouseMove-Ereignisses können Sie den Index des Elements, über dem sich die Maus befindet, nachverfolgen und in einer Variablen speichern, die ihren Wert zwischen MouseMoves behält. Jedes Mal, wenn MouseMove ausgelöst wird, wird überprüft, ob sich der Index geändert hat. Wenn dies der Fall ist, wird der QuickInfo deaktiviert, der QuickInfo-Text für dieses Steuerelement geändert und dann erneut aktiviert.

Es folgt ein Beispiel, in dem eine einzelne Eigenschaft einer Car-Klasse in einer ListBox angezeigt wird. Beim Überfahren einer beliebigen Zeile werden jedoch vollständige Informationen angezeigt. Damit dieses Beispiel funktioniert, benötigen Sie lediglich eine ListBox namens lstCars mit einem MouseMove-Ereignis und eine ToolTip-Textkomponente namens tt1 auf Ihrer WinForm.

Definition der Fahrzeugklasse:

    class Car
    {
        // Main properties:
        public string Model { get; set; }
        public string Make { get; set; }
        public int InsuranceGroup { get; set; }
        public string OwnerName { get; set; }
        // Read only property combining all the other informaiton:
        public string Info { get { return string.Format("{0} {1}\nOwner: {2}\nInsurance group: {3}", Make, Model, OwnerName, InsuranceGroup); } }
    }

Formularladeereignis:

    private void Form1_Load(object sender, System.EventArgs e)
    {
        // Set up a list of cars:
        List<Car> allCars = new List<Car>();
        allCars.Add(new Car { Make = "Toyota", Model = "Yaris", InsuranceGroup = 6, OwnerName = "Joe Bloggs" });
        allCars.Add(new Car { Make = "Mercedes", Model = "AMG", InsuranceGroup = 50, OwnerName = "Mr Rich" });
        allCars.Add(new Car { Make = "Ford", Model = "Escort", InsuranceGroup = 10, OwnerName = "Fred Normal" });

        // Attach the list of cars to the ListBox:
        lstCars.DataSource = allCars;
        lstCars.DisplayMember = "Model";
    }

Der QuickInfo-Code (einschließlich der Erstellung der Klassenebenenvariablen mit dem Namen hoveredIndex):

        // Class variable to keep track of which row is currently selected:
        int hoveredIndex = -1;

        private void lstCars_MouseMove(object sender, MouseEventArgs e)
        {
            // See which row is currently under the mouse:
            int newHoveredIndex = lstCars.IndexFromPoint(e.Location);

            // If the row has changed since last moving the mouse:
            if (hoveredIndex != newHoveredIndex)
            {
                // Change the variable for the next timw we move the mouse:
                hoveredIndex = newHoveredIndex;

                // If over a row showing data (rather than blank space):
                if (hoveredIndex > -1)
                {
                    //Set tooltip text for the row now under the mouse:
                    tt1.Active = false;
                    tt1.SetToolTip(lstCars, ((Car)lstCars.Items[hoveredIndex]).Info);
                    tt1.Active = true;
                }
            }
        }
Question

Ich habe ein Listenfeld, das als Datenverbindung zu einer Sammlung von Objekten dient. Die Listbox ist so konfiguriert, dass sie eine Bezeichner-Eigenschaft jedes Objekts anzeigt. Ich möchte einen Tooltip mit Informationen anzeigen, die sich auf das Element innerhalb des Listenfelds beziehen, über das die Maus bewegt wird, und nicht über eine QuickInfo für die gesamte Listbox.

Ich arbeite in WinForms und habe dank einiger hilfreicher Blogbeiträge eine ziemlich nette Lösung zusammengestellt, die ich teilen wollte.

Es würde mich interessieren, ob es andere elegante Lösungen für dieses Problem gibt oder wie dies in WPF gemacht werden kann.




Hier ist ein Stil, der eine Gruppe von RadioButtons mithilfe einer ListBox erstellt. Alles ist für MVVM-ing gebunden. MyClass enthält zwei String-Eigenschaften: MyName und MyToolTip. Dadurch wird die Liste der RadioButtons angezeigt, einschließlich des ToolTip-ing. Von Interesse für diesen Thread ist der Setter für ToolTip in der Nähe von unten, was dies zu einer Komplettlösung von Xaml macht.

Beispielverwendung:

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

Stil:

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



Mit onmouseover Sie durch jedes Element der Liste iterieren und den ToolTip

onmouseover="doTooltipProd(event,'');

function doTooltipProd(e,tipObj)
{

    Tooltip.init();
      if ( typeof Tooltip == "undefined" || !Tooltip.ready ) {
      return;
      }
      mCounter = 1;
   for (m=1;m<=document.getElementById('lobProductId').length;m++) {

    var mCurrent = document.getElementById('lobProductId').options[m];
        if(mCurrent != null && mCurrent != "null") {
            if (mCurrent.selected) {
                mText = mCurrent.text;
                Tooltip.show(e, mText);
                }
        }   
    }   
}