none
WPF Tooltip im Code ein und ausschalten RRS feed

  • Frage

  • Hallo

    Ich möchte in mein kleinen Programm dieses Tooltip als Hilfe benutzen. 

    Ich habe ein Window Form als Einstellungen wo man dort per Checkbox diese Tooltip (Hilfe Anzeigen) ein und ausschalten kann und diese in Programm Setting gespeichert wird.

    Nun möchte ich in MainWindow_Loaded diese ToolTip auf False oder True setzen die für alle Controls gilt.

    Ist das möglich? und wie macht man das?

    Danke im voraus.

    Freitag, 27. März 2020 09:51

Antworten

  • Hi,
    IsMinimized und Margin kann man beispielsweise so verknüpfen:

        <CheckBox x:Name="cb" Content="Ribbon Minimized On/Off"/>
    …
        <Ribbon x:Name="Ribbon1" 
                Height="140" 
                VerticalAlignment="Top" 
                IsMinimized="{Binding IsChecked, ElementName=cb}">
          <Ribbon.Style>
            <Style TargetType="Ribbon">
              <Setter Property="Margin" Value="0 45 0 0"/>
              <Style.Triggers>
                <Trigger Property="IsMinimized" Value="True">
                  <Setter Property="Margin" Value="0 140 0 0"/>
                </Trigger>
              </Style.Triggers>
            </Style>
          </Ribbon.Style>
          <Ribbon.ApplicationMenu>
    ...


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 2. April 2020 05:15

Alle Antworten

  • Hi,
    nutze einfach die Active-Eigenschaft des ToolTips:

      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ToolTip1.Active = True ' oder False
      End Sub


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Samstag, 28. März 2020 14:22
  • Hallo

    Danke für die Antwort

    Ich hatte mit oben glaub falsch ausgedrückt ich benutze ein WPF Form kein Windows Form

    des müsste irgendwo bei ToolTipService mit drin sind aber ich finde es leider nicht

    Samstag, 28. März 2020 14:32
  • Hi,
    da du nicht im WPF Forum postest, bin ich davon ausgegangen, dass du Windows Forms meinst.

    In WPF kanns du das so machen:

      <StackPanel>
        <CheckBox x:Name="cb" Content="ToolTip Visibility"/>
        <TextBlock Text="Info" ToolTip="ToolTip Info" ToolTipService.IsEnabled="{Binding IsChecked, ElementName=cb}" />
      </StackPanel>


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Sonntag, 29. März 2020 08:05
  • wie kann man das im Code machen ohne diese CheckBox?

    mochte im vb Code nur das True und False einsetzen

    Dienstag, 31. März 2020 08:03
  • Hi,
    hier mal ein Beispiel in VB.NET mit dem MVVM Entwurfsmuster. Mit dem Button wird die Eigenschaft "SwitchOnOff" wechselseitig true/false gesetzt. Die Eigenschaft "SwitchOnOff" ist in der Oberfläche an die IsOn-Eigenschaft des UserControls gebunden. Über INotifyPropertyChanged wird die Änderung des Wertes der Eigenschaft "SwitchOnOff" an die Obfläche gemeldet, die sich dann den neuen Wert holt und die Anzeige aller davon betroffenen Steuerelemente aktualisiert.

    XAML:

    <Window x:Class="Window96"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            xmlns:uc="clr-namespace:WpfControlLibrary1;assembly=WpfControlLibrary1"
            mc:Ignorable="d"
            Title="Window96" Height="450" Width="800">
      <Window.DataContext>
        <local:Window96VM/>
      </Window.DataContext>
      <StackPanel>
        <Button Content="Set ON/OFF IsOn" Command="{Binding Cmd}"/>
        <uc:Window96UC1 IsOn="{Binding SwitchOnOff}"/>
      </StackPanel>
    </Window>

    Und der ViewModel:

    Imports System.ComponentModel
    Imports System.Runtime.CompilerServices
    
    Public Class Window96VM
      Implements INotifyPropertyChanged
    
      Public Property SwitchOnOff As Boolean
    
      Public ReadOnly Property Cmd As ICommand = New RelayCommand(Sub(state)
                                                                    SwitchOnOff = Not SwitchOnOff
                                                                    OnPropChanged(NameOf(SwitchOnOff))
                                                                  End Sub)
    
      Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
      Private Sub OnPropChanged(<CallerMemberName> Optional propName As String = "")
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
      End Sub
    
    End Class


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Dienstag, 31. März 2020 08:44
  • Hallo

    Danke für dieses Beispiel hab wieder was dazugelernt.

    Wie ist es aber wenn ich es in my.Setting es Speichere

    Ist Tooltip als True gespeichert solles auf True gesetzt sein und wenn es ToolTip auf False gespeichert ist es auf False.

    Darum hatte ich gefragt wie man es mit True und False diese ein und ausschalten kann.

    werde das möglich?

    Dienstag, 31. März 2020 19:51
  • Hi,
    du kannst über Setting im Projekt eine Eigenschaft anlegen (z.B. "SwitchOnOff als Boolean), die dann im Programm genutzt werden kann. Der ViewModel in meinem vorherigen Beispiel kann dann so aussehen:

    Imports System.ComponentModel
    Imports System.Runtime.CompilerServices
    
    Public Class Window96VM
      Implements INotifyPropertyChanged
    
      Public Property SwitchOnOff As Boolean
        Get
          Return My.Settings.SwitchOnOff
        End Get
        Set(value As Boolean)
          My.Settings.SwitchOnOff = value
          My.Settings.Save()
          OnPropChanged()
        End Set
      End Property
    
      Public ReadOnly Property Cmd As ICommand = New RelayCommand(Sub(state)
                                                                    SwitchOnOff = Not SwitchOnOff
                                                                  End Sub)
    
      Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
      Private Sub OnPropChanged(<CallerMemberName> Optional propName As String = "")
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
      End Sub
    
    End Class


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Mittwoch, 1. April 2020 08:34
  • Hallo

    Ich versteh diesen Code irgendwie nicht. Mir ist es nicht ersichtlich das er nur diesen ToolTip aus oder einschaltet. 

    Ich möchte in MainWindow_Loaded diese Abfrage

    If hilfe="true" then

    else

    end if

    gibt es kein einfachen weg diesen Tooltip ein oder auszuschalten?

    Mittwoch, 1. April 2020 14:10
  • Hi,
    da du bisher nicht geschrieben hast, welche konkrete Technologie du nutzt, habe ich dir den einfachsten Weg gezeigt:

    1. Im Code gibt es eine Eigenschaft, die die Settings bereitstellt und bei Änderung auch wieder abspeichert.

    2. In der Oberfläche ist die Eigenschaft des UserControls an diese Eigenschaft gebunden.

    3. Damit die Oberfläche mitbekommt, dass sich der Wert der gebundenen Eigenschaft geändert hat, wird in der Eigenschaft INotifyPropertyChanged genutzt.

    Ich vermute mal, du arbeitest klassisch im CodeBehind im Mix von Oberflächendesign und Programmlogik wie in den Anfängen vor OOP. Da diese Arbeitsweise umständlich, schwer wartbar und auch nicht einfach testbar ist, habe ich mich schon lange davon verabschiedet. Das solltest du vielleicht auch in Betracht ziehen.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Mittwoch, 1. April 2020 14:19
  • Ich hatte damals GWBasic gelernt, bin dann auf QBasic ist ja fast das gleiche, dann auf Visual Basic 6.0 das war schon eine Umstellung von VB 6.0 war es dann Visual Basic.net des war wieder eine sehr große Umstellung jetzt möchte ich noch so gut wie es geht mit WPF es machen.

    Hier schon man mein Code

    xaml

    <RibbonWindow x:Class="MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp8"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <Ribbon x:Name="Ribbon1" Height="140" VerticalAlignment="Top">
                <Ribbon.ApplicationMenu>
                    <RibbonApplicationMenu x:Name="Ribbon_Menu" LargeImageSource="Images/Ribbon/Ribbon_Menu.png" SmallImageSource="Images/Ribbon/Ribbon_Menu.png">
    
                        <RibbonApplicationMenu.FooterPaneContent>
                            <RibbonButton x:Name="Ribbon_Menu_Beenden"
                                          Label="Beenden"
                                          SmallImageSource="Images/Ribbon/Exit_40.png"
                                          HorizontalAlignment="Right"/>
                        </RibbonApplicationMenu.FooterPaneContent>
    
                        <RibbonApplicationMenuItem x:Name="Ribbon_Menu_Einstellungen" Header="_Einstellungen" ImageSource="Images/Ribbon/Einstellung.png"/>
    
                    </RibbonApplicationMenu>
                </Ribbon.ApplicationMenu>
    
                <Ribbon.HelpPaneContent>
                    <RibbonButton x:Name="Ribbon_Klappen"
                                  Content="Klappen"
                                  SmallImageSource="Images/Ribbon/Ribbon_Pfeiloben.png"/>
                </Ribbon.HelpPaneContent>
    
                <RibbonTab x:Name="Ribbon_Tab_Start" Header="_Start">
                    <RibbonGroup x:Name="Ribbon_Tab_Start_Gruppe_Test" Header="_Test" Height="88" Margin="0" VerticalAlignment="Top" Width="258">
                        <RibbonButton x:Name="RibbonButton_UEbersicht" Content="RibbonButton" HorizontalAlignment="Left" Height="59" Margin="0,5,-71,-60" VerticalAlignment="Top" Width="75" Label="_Übersicht" LargeImageSource="Images/Ribbon/UEbersicht_40.png" ToolTipTitle="ist ein Titel" ToolTipDescription="das ist die Beschreibung" ToolTipImageSource="Images/Ribbon/UEbersicht_40.png" ToolTipFooterTitle="test Footer" ToolTipFooterDescription="Footer Beschreibung" ToolTipFooterImageSource="Images/Ribbon/Einstellung.png"/>
                    </RibbonGroup>
    
                </RibbonTab>
            </Ribbon>
    
        </Grid>
    </RibbonWindow>

    VB Code

    Class MainWindow
    
    
        Private Sub Ribbon_Klappen_Click(sender As Object, e As RoutedEventArgs) Handles Ribbon_Klappen.Click
            If Ribbon1.IsMinimized = False Then
                Ribbon1.IsMinimized = True
    
                DockingManager1.Margin = New Thickness(0, 45, 0, 0)
                'TODO: Hier muss sich das Bild verändern in RIBBON
                ' Ribbon_Klappen.SmallImageSource = New BitmapImage(New Uri("Images/Ribbon/Pfeiloben.png"))
            ElseIf Ribbon1.IsMinimized = True Then
                Ribbon1.IsMinimized = False
                DockingManager1.Margin = New Thickness(0, 140, 0, 0)
                '  Ribbon_Klappen.SmallImageSource = New BitmapImage(New Uri("Images/Ribbon/Pfeilunten.png"))
            End If
    
        End Sub
    
        Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    
            If Not System.IO.File.Exists("Einstellung.db") Then
    
                Dim dbErstellen As New Klasse_DB
                dbErstellen.Einstellung_DB_Erstellen()
                dbErstellen.Einstellung_DB_Allgemein_grundeinstellung()
    
            End If
    
            '   Me.SetValue(ToolTipService.IsEnabledProperty, False)
    
            '   ToolTipService.SetIsEnabled(ToolTip, False)
    
    
    
        End Sub
    
        Private Sub RibbonButton_UEbersicht_Click(sender As Object, e As RoutedEventArgs) Handles RibbonButton_UEbersicht.Click
    
            Dim Form1 = New AvalonDock.Layout.LayoutAnchorable
    
    
            Form1.Title = "Übersicht"
            Form1.CanHide = True
            Form1.CanClose = True
            Form1.ContentId = "Form1"
            Form1.IsSelected = True
            Form1.Content = MyControl
    
            myLayoutDocumentPane.Children.Add(Form1)
        End Sub
    
        Private Sub Ribbon_Menu_Einstellungen_Click(sender As Object, e As RoutedEventArgs) Handles Ribbon_Menu_Einstellungen.Click
            Dim Einstellungen_starten As New Einstellung_Hauptform
            Einstellungen_starten.Show()
    
        End Sub
    
    
    End Class
    

    Mittwoch, 1. April 2020 15:07
  • Hi,
    und wo im Code wird das Ereignis die Sichtbarkeit des ToolTips gesetzt, geändert und gespeichert?

    Dein Code entspricht der alten in VB6 genutzten Technologie des Mischens von Design und Programmlogik. Da ist es sehr schwer, ein Problem zu beseitigen. Z.B. Ribbon1.IsMinimized und DockingManager1.Margin ist Design und sollte im XAML mit Style und Trigger gestaltet werden.

    Für den Anfang kann man die Design-Abläufe auch im CodeBehind halten. Die Programmlogik sollte aber auch da schon in separate Objekte (Klassen) ausgelagert werden.


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Mittwoch, 1. April 2020 16:01
  • Danke für die Antwort

    Ich bin gern bereit Verbesserungen anzunehmen.

    Wie macht man das dann mit dem Ribbon1.IsMinimized und DockingManager1.Margin in dem Design? 

    Mittwoch, 1. April 2020 16:29
  • Hi,
    IsMinimized und Margin kann man beispielsweise so verknüpfen:

        <CheckBox x:Name="cb" Content="Ribbon Minimized On/Off"/>
    …
        <Ribbon x:Name="Ribbon1" 
                Height="140" 
                VerticalAlignment="Top" 
                IsMinimized="{Binding IsChecked, ElementName=cb}">
          <Ribbon.Style>
            <Style TargetType="Ribbon">
              <Setter Property="Margin" Value="0 45 0 0"/>
              <Style.Triggers>
                <Trigger Property="IsMinimized" Value="True">
                  <Setter Property="Margin" Value="0 140 0 0"/>
                </Trigger>
              </Style.Triggers>
            </Style>
          </Ribbon.Style>
          <Ribbon.ApplicationMenu>
    ...


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 2. April 2020 05:15