none
RibbonGalleryCategory RRS feed

  • Frage

  • Hallo ;) Folgendes Problem bekomme ich nicht in den Griff :

    Ich habe mir eine Verlaufsansicht in einem RibbonApplicationMenu programmiert, welches mir die letzten geöffneten Programme anzeigen soll. Funktioniert auch soweit, nur kommt es manchmal vor, dass beim Löschen der Items in der RibbonGalleryCategory eine Ausnahme auftritt, die aussagt, dass der Objektverweis nicht auf eine Objektinstanz festgelegt wurde ...

    CodeBehind sieht folgendermaßen aus :

     

     

    Private vItem As New Microsoft.Windows.Controls.Ribbon.RibbonGalleryItem
    
     Private Table As String() = Nothing
    
     Private Sub Read_RecentApps()
     Try 
     If File.Exists("RecentApps.isf") = True Then
     Dim Reader As StreamReader = File.OpenText("RecentApps.isf")
     Table = Reader.ReadToEnd.Split(";")
     Reader.Close()
     Dim RecentApps(10) As String
     Dim x As Integer = 0
     If Not RGCrecentapps.Items.Count - 1 = 0 Then RGCrecentapps.Items.Clear()
     For i As Integer = Table.Count - 2 To 0 Step -1 'Aufgrund ";" nach dem letzen Eintrag
      If Not x > 10 Then RecentApps(x) = Table(i).Trim Else Exit For
      vItem = New Microsoft.Windows.Controls.Ribbon.RibbonGalleryItem
      AddHandler vItem.Selected, AddressOf RibbonGalleryItem_Selected
      vItem.Content = RecentApps(x).Trim
      RGCrecentapps.Items.Add(vItem)
      x = x + 1
     Next
     End If
     Catch ex As Exception
     MessageBox.Show(ex.Message)
     End Try
     End Sub
    

     

    Die Ausnahme wird beim Aufruf RGCrecentapps.Items.Clear() ausgelöst. Habe aber keine Ahnung warum. 

    Habe dann versucht, RGCrecentapps.Items.Clear() durch RGCrecentapps = New Microsoft.Windows.Controls.Ribbon.RibbonGalleryCategory

    zu ersetzen, nur leider werden mir danach keine Items in der Liste angezeigt, obwohl ich im Debugger sehe, dass Items in RGCrecentapps.Items.Count vorhanden sind ... 

     

    Bin mir nicht sicher, ob es dafür eine Lösung gibt, hoffe ihr könnt mir doch dafür einen Ansatz zeigen :)

    Freundliche Grüße

     

    Dienstag, 24. August 2010 09:46

Antworten

  • Hallo Roland,

    Dass Clear nicht immer das tut was man vielleicht "erwartet" ist hier beschrieben:

    [Implementation von Clear bei einer .NET-WinForm-ControlCollection]
    http://dzaebel.net/Clear.htm

    Insofern implementiere das Clear selber folgendermassen:

       Private Sub ClearItems(ByVal rgc As RibbonGalleryCategory)
        While rgc.Items.Count > 0
         rgc.Items.Remove(rgc.Items(0))
        End While
       End Sub
    
    

    nebst:
     ....  Then ClearItems(RGCrecentapps)
    

    Bei mir klappt das dann.


    ciao Frank
    Mittwoch, 25. August 2010 19:13

Alle Antworten

  • Hab nun probiert, es statt RGCrecentapps.Items.Clear() mit RGCrecentapps = New Microsoft.Windows.Controls.Ribbon.RibbonGalleryCategory

     

     Private vItem As New Microsoft.Windows.Controls.Ribbon.RibbonGalleryItem
     Private Table As String() = Nothing
    
     Private Sub Read_RecentApps()
      Try   
       If File.Exists("RecentApps.isf") = True Then
        Dim Reader As StreamReader = File.OpenText("RecentApps.isf")
        Table = Reader.ReadToEnd.Split(";")
        Reader.Close()
        Dim RecentApps(10) As String
        Dim x As Integer = 0
        If Not RGCrecentapps.Items.Count - 1 = 0 Then
         RGCrecentapps = New Microsoft.Windows.Controls.Ribbon.RibbonGalleryCategory
         Dim FactoryPanel As New FrameworkElementFactory(GetType(StackPanel))
         FactoryPanel.SetValue(StackPanel.IsItemsHostProperty, True)
         Dim Template As New ItemsPanelTemplate()
         Template.VisualTree = FactoryPanel
         RGCrecentapps.ItemsPanel = Template
        End If
        For i As Integer = Table.Count - 2 To 0 Step -1 'Aufgrund ";" nach dem letzen Eintrag
         If Not x > 10 Then RecentApps(x) = Table(i).Trim Else Exit For
         vItem = New Microsoft.Windows.Controls.Ribbon.RibbonGalleryItem
         AddHandler vItem.Selected, AddressOf RibbonGalleryItem_Selected
         vItem.Content = RecentApps(x).Trim
         RGCrecentapps.Items.Add(vItem)
         x = x + 1
        Next
       End If
      Catch ex As Exception
       MessageBox.Show(ex.Message)
      End Try
    
    Leider ohne Erfolg : RGCrecentapps.Items.Add(vItem) : Items werden geschrieben, aber die Liste in der Anzeige bleibt trotzdem leer ... Das gleiche nur mit RGCrecentapps.Items.Clear() funktioniert, aber nur kommt eben nach ein paar mal Aufrufen der Programme der Error ...

     

    Dienstag, 24. August 2010 10:44
  • Hallo W.,

    das kann ich mit folgendem Code nicht nachvollziehen. Deswegen ist ggf. noch etwas mehr Code bzw. Ereignisse bei Dir implementiert.

    <ribbon:RibbonWindow 
     x:Class="MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
     Title="MainWindow" 
     x:Name="RibbonWindow"
     Width="640" Height="480">
    
     <Grid x:Name="LayoutRoot">
     <Grid.RowDefinitions>
     <RowDefinition Height="Auto"/>
     <RowDefinition Height="*"/>
     </Grid.RowDefinitions>
    
     <ribbon:Ribbon x:Name="Ribbon">
     <ribbon:Ribbon.ApplicationMenu>
     <ribbon:RibbonApplicationMenu 
      SmallImageSource="Images\SmallIcon.png">
      <ribbon:RibbonApplicationMenu.AuxiliaryPaneContent>
      <ribbon:RibbonGalleryCategory
      Name="RGCrecentapps">
      </ribbon:RibbonGalleryCategory>
      </ribbon:RibbonApplicationMenu.AuxiliaryPaneContent>
      <ribbon:RibbonApplicationMenuItem 
      Height="Auto"
      Header="Hello _Ribbon"
      x:Name="MenuItem1"
      ImageSource="Images\LargeIcon.png"/>
     </ribbon:RibbonApplicationMenu>
    
     </ribbon:Ribbon.ApplicationMenu>
     <ribbon:RibbonTab 
     x:Name="HomeTab"
     Header="Home">
     <ribbon:RibbonGroup 
      x:Name="Group1"
      Header="Group1">
      <ribbon:RibbonButton 
      x:Name="Button2"
      SmallImageSource="Images\SmallIcon.png"
      Label="Read neu" />
     </ribbon:RibbonGroup>
    
     </ribbon:RibbonTab>
     </ribbon:Ribbon>
    
     </Grid>
    </ribbon:RibbonWindow>
    
    

    __________________________

    Imports System.IO
    
    Class MainWindow
     Private vItem As New Microsoft.Windows.Controls.Ribbon.RibbonGalleryItem
     Private Table As String() = Nothing
    
     Private Sub Read_RecentApps()
     Try
      If File.Exists("RecentApps.isf") = True Then
      Dim Reader As StreamReader = File.OpenText("RecentApps.isf")
      Table = Reader.ReadToEnd.Split(";")
      Reader.Close()
      Dim RecentApps(10) As String
      Dim x As Integer = 0
      If Not RGCrecentapps.Items.Count - 1 = 0 Then RGCrecentapps.Items.Clear()
      For i As Integer = Table.Count - 2 To 0 Step -1 'Aufgrund ";" nach dem letzen Eintrag
       If Not x > 10 Then RecentApps(x) = Table(i).Trim Else Exit For
       vItem = New Microsoft.Windows.Controls.Ribbon.RibbonGalleryItem
       AddHandler vItem.Selected, AddressOf RibbonGalleryItem_Selected
       vItem.Content = RecentApps(x).Trim
       RGCrecentapps.Items.Add(vItem)
       x = x + 1
      Next
      End If
     Catch ex As Exception
      MessageBox.Show(ex.Message)
     End Try
     End Sub
    
     Private Sub RibbonGalleryItem_Selected(ByVal sender As Object, ByVal e As RoutedEventArgs)
     MsgBox(sender)
     End Sub
    
     Private Sub RibbonWindow_Loaded( 
       ByVal sender As System.Object, 
       ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
     Read_RecentApps()
     End Sub
    
     Private Sub Button2_Click( 
       ByVal sender As System.Object, 
       ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
     Read_RecentApps()
     End Sub
    End Class
    

     


    ciao Frank

    Dienstag, 24. August 2010 18:15
  • Tut mir leid, du kannst natürlich aus dem bisschen Code nicht absehen, was ich vorhabe, aber soweit gut erraten :)

    Zum Verständnis : Ich rufe über Buttons im Ribbon Fenster auf. Die Namen der Fenster speichere ich in der "RecentApps.isf". Aus dieser *txt Datei lese ich nun die Programmnamen in verkehrter Reihenfolge ein, um so zu ermitteln, welche Programme zuletzt aufgerufen wurden.

    Dies passiert eben in Private Sub Read_RecentApps() . Das bedeutet, ich erstelle im Code Behind nun die Items für die RibbonGalleryCategory, statt sie direkt im XAML zuzuweisen.

    Nun sieht die RibbonGallery des RibbonApplicationMenu so aus :

     

     <r:Ribbon.ApplicationMenu>
       <r:RibbonApplicationMenu Height="23">
    <r:RibbonApplicationMenu.AuxiliaryPaneContent>
        <r:RibbonGallery CanUserFilter="False" ScrollViewer.VerticalScrollBarVisibility="Auto">
         <r:RibbonGalleryCategory Name="RGCrecentapps" Header="zuletzt geöffnete Programme . . ." Background="Transparent" FontStyle="Italic">
         <r:RibbonGalleryCategory.ItemsPanel>      
          <ItemsPanelTemplate>        
          <StackPanel Orientation="Vertical" IsItemsHost="True"/>             
          </ItemsPanelTemplate>
         </r:RibbonGalleryCategory.ItemsPanel>
         </r:RibbonGalleryCategory>
        </r:RibbonGallery>
        </r:RibbonApplicationMenu.AuxiliaryPaneContent>
    </r:RibbonApplicationMenu>
    </r:Ribbon.ApplicationMenu>
    

     

    Und nun versuche ich, über die Private Sub Read_RecentApps() die Items dort reinzustellen, doch ich muss die Liste immer wieder vor dem befüllen löschen, da ich die Items ja mit RGCrecent.Items.Add(vItems) eintrage. 

    Sobald ich aber öfters in die "Read_RecentApps()" im Programmablauf reingehe bekomm ich den Error ...

    Aus irgendeinem Grund löscht er nicht nur die Liste, sondern anscheinend das ganze Objekt ... aber erst nach dem 3 - 5 Mal ...

    Bei "RibbonGalleryItem_Selected" öffne ich das Programm, auf dessen Namen geklickt wurde, und gehe wieder in die Private Sub Read_RecentApps() lesen ...

    Hoffe du kannst damit was anfangen, ist sehr schwer, wenn du das Problem nicht "sehen" kannst ... ;)

    Vorstellen kann man sich das ja wie in Word oder so, da stehen auch die letzt geöffneten Dokumente drinnen. So wollte ich das auch machen, geht ja auch soweit, bis auf dass, das eben nach zu oftmaligen öffnen mit den RibbonGalleryItems der Bug entsteht ...

    Schöne Grüße ^^

     

    Dienstag, 24. August 2010 20:58
  • Hallo W.,

    Dein Code und Vorhaben war mir vollkommen klar, da hättest Du gar nichts mehr beschreiben brauchen.
    Wie gesagt - ich habe keine Probleme, Deine Read_RecentApps() ein vielfaches aufzurufen. Es muss an einem anderen Teil des Codes oder Umstand liegen, als der, der hier sichtbar ist.
    Das XAML habe ich jetzt mal in meinem Projekt auf Dein RibbonApplicationMenu angepasst - Code ist in etwa gleich - funktioniert trotzdem.

    Probiere doch einfach mal [mein Projekt] aus, ob es bei Dir funktioniert.


    ciao Frank
    Mittwoch, 25. August 2010 04:16
  • ;) Danke für dein Test - Projekt, ich habe mir erlaubt, deine Anwendung umzuschreiben, so wie sie bei mir aussieht. 

    Ich bekomme nun auch hier wieder den Fehler. 

    Folgendes habe ich verändert :

    Im RibbonTab habe ich nun ein PullDown Menü, in dem befinden sich 5 Items. 

    Die RecentApp.isf habe ich aus dem Projekt entfernt, sie liegt nun nur im Ordner Bin\Debug

    Weiters sortiere ich auch nun die Liste, indem ich das zuletzt angeklickte Item wieder in die Liste schreibe.

     

    So, um den Fehler auszulösen, musst du folgendes machen :

    1. Öffne das Programm
    2. Klicke im "Home" - Tab auf "Programme"
    3. Klicke 1-5 Items in diesem PullDown-Menü an
    4. Öffne dann das Application Menü, nun stehen dort die geklickten Items
    5. Klicke 1-5 dieser Items an
    6. Und nun wieder im "Home" - Tab auf "Programme" 1 Item anklicken, nun kommt der Error -> Objektverweis .... !!

    Grüße, Roland

    Mittwoch, 25. August 2010 09:31
  • Hallo Roland,

    Dass Clear nicht immer das tut was man vielleicht "erwartet" ist hier beschrieben:

    [Implementation von Clear bei einer .NET-WinForm-ControlCollection]
    http://dzaebel.net/Clear.htm

    Insofern implementiere das Clear selber folgendermassen:

       Private Sub ClearItems(ByVal rgc As RibbonGalleryCategory)
        While rgc.Items.Count > 0
         rgc.Items.Remove(rgc.Items(0))
        End While
       End Sub
    
    

    nebst:
     ....  Then ClearItems(RGCrecentapps)
    

    Bei mir klappt das dann.


    ciao Frank
    Mittwoch, 25. August 2010 19:13
  • Super ;) Funktioniert einwandfrei. Danke für die Zeit, die du in mein Problem investiert hast.

    Schöne Grüße, Roland

    Mittwoch, 25. August 2010 20:17