Autor Beitrag
henni
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win 7
Delphi 5 Standart, C# (Visual Studio 2008 Express Edition)
BeitragVerfasst: Mi 20.10.10 10:27 
Hallo!

Ich will ein Info-System entwickeln, welches autonom auf einem sehr großen Monitor läuft.
Die Informationen passen in der Regel nicht alle auf den Monitor, weshalb gescrollt werden muss.
Da es keinen direkten Benutzer gibt, das Programm also in einem Art Kiosk-Modus läuft, muss das Programm automatisch scrollen.
Allerdings soll es, nachdem alle Informationen angezeigt wurden, wieder von vorne anfangen - wie auf einem Laufband.

Gescrollt soll in Einheiten, nicht in Elementen - das scrollen soll also flüssig sein.

Bei den Informationen handelt es sich um Vertretungen (für die Schule) mit mehreren Eigenschaften (Lehrer, Klasse, Raum etc.) - es handelt sich also um eine Tabelle, wobei der Inhalt scrollt und die Kopfzeile der Tabelle stehen bleibt.

Gibt es soetwas schon?
Oder wie kann man das am besten machen?

Google spukt nicht viel heraus: Link.
Der Eintrag bezieht sich auf eine Seite, die nicht mehr existiert.
Dieser Thread bezieht sich auch auf den obigen Link, der nicht mehr verfügbar ist.
Am Ende wird zwar eine Lösung genannt, die aber in Elementen scrollt, d.h. ein Scroll bewirkt keine Verschiebung um eine Einheit sondern um ein Element - das sieht sehr unschön aus.

Vielen Dank im vorraus!
traceurmicha
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 160
Erhaltene Danke: 9

Win XP SP2, Win 7 Pro., Ubuntu 9, Debian 5
C#, ASP.NET, MSSQL, PHP(Microsoft Visual Studio 2010 Ultimate, SharpDevelop 4, Microsoft SQL Server2008 Express, Eclipse for PHP)
BeitragVerfasst: Mi 20.10.10 10:44 
Hy Henni!

Das was du machen willst, gibt es! Naja jedenfalls wird sowas an meiner Berufsschule auch benutz. Vielleicht kannst du dich ja mal mit denen auseinandersetzen!? Bin am Oberstufenzentrum für Informations und Medizintechnik (oszimt)

Hier die Internetpräsenz: www.oszimt.de

_________________
Programmieren ist ein Rennen zwischen den Softwareentwicklern, die versuchen größere und bessere idiotensichere Programme zu schreiben und dem Universum, welches versucht größere und bessere Idioten zu produzieren. Zur Zeit liegt das Universum in Führung.
henni Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win 7
Delphi 5 Standart, C# (Visual Studio 2008 Express Edition)
BeitragVerfasst: Mi 20.10.10 10:51 
Danke für deine Antwort,

Zitat:
Das was du machen willst, gibt es!

Ich weiß - ich will aber ein eigenes schreiben.
Unsere Schule hat auch schon die Software (dsbControl oder so ähnlich) für den Monitor, die aber nicht nur unübersichtlich ist, sondern auch total überteuert.

Die Datensätze ich habe auch schon geparst, lediglich Darstellen muss ich die Daten noch.
henni Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win 7
Delphi 5 Standart, C# (Visual Studio 2008 Express Edition)
BeitragVerfasst: So 24.10.10 14:54 
Bisher habe ich mir ein AutoScrollStackPanel geschrieben, dass "MeasureOverride" und "ArrangeOverride" überschreibt.
Dieses Panel funktioniert wie das Stackpanel, verfügt aber über eine Offset-Eigenschaft, die die Elemente um diesen Wert verschiebt und einen Timer, der den Offset schrittweise erhöht.
Die Elemente müssen aber nicht verschoben werden (also das Offset muss nicht darauf addiert werden), wenn genügend Platz da ist, d.h. wenn sowieso alle Elemente sichtbar sind.

Da ich eine Listbox benutze, habe ich die Eigenschaft ItemsPanel einem AutoScrollStackPanel zugwiesen:
ausblenden XML-Daten
1:
2:
3:
4:
5:
<ListBox.ItemsPanel>
  <ItemsPanelTemplate>
    <o:AutoScrollStackPanel ScrollSpeed="0.5" />
  </ItemsPanelTemplate>
</ListBox.ItemsPanel>


Mein Problem ist jetzt allerdings, dass die ListBox den Parameter "availableSize" in der Methode "MeasureOverride" immer mit unendlich angibt.
Ist auch eigentlich logisch - die ListBox zeigt Scrollbalken an, wenn der Platz knapp wird.
Wenn mein Panel aber immer davon ausgeht, dass unendlich viel Platz zur Verfügung steht, wird es selbst nie automatisch scrollen!
Denn immer wenn mehr Elemente vorhanden sind, als überhaupt angezeigt werden können, bildet die ListBox von sich aus schon Scrollbalken.
Wie kann das verhindert werden?
henni Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Win 7
Delphi 5 Standart, C# (Visual Studio 2008 Express Edition)
BeitragVerfasst: So 24.10.10 15:00 
Hmm, obwohl ich jetzt schon über zwei Stunden an diesem Scroll-Problem sitze, bin ich erst auf die Lösung gekommen, als ich mein Problem hier im Forum gepostet habe.
Die Lösung ist folgende:
ausblenden XML-Daten
1:
2:
3:
<ScrollViewer.VerticalScrollBarVisibility>
  disabled
</ScrollViewer.VerticalScrollBarVisibility>



Die endgültige Lösung ist folgende:
ausblenden volle Höhe C#-Quelltext
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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
public class AutoScrollStackPanel : Panel
    {
        private double scrollOffset;
        public double ScrollOffset
        {
            get { return scrollOffset; }
            set
            {
                if (scrollOffset != value)
                {
                    if (totalHeight > 0)
                        scrollOffset = value % totalHeight;

                    InvalidateMeasure();
                }
            }
        }

        DispatcherTimer timer;

        public AutoScrollStackPanel()
        {
            ClipToBounds = true;

            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(10);

            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();
        }


        public double ScrollSpeed
        {
            get { return (double)GetValue(ScrollSpeedProperty); }
            set { SetValue(ScrollSpeedProperty, value); }
        }

        public static readonly DependencyProperty ScrollSpeedProperty =
            DependencyProperty.Register("ScrollSpeed"typeof(double), typeof(AutoScrollStackPanel), new UIPropertyMetadata(1.0));


        void timer_Tick(object sender, EventArgs e)
        {
            ScrollOffset += ScrollSpeed;
        }

        private double totalHeight;

        protected override Size MeasureOverride(Size availableSize)
        {
            Size resultSize = new Size(00);

            foreach (UIElement child in Children)
            {
                child.Measure(availableSize);
                resultSize.Width = Math.Max(resultSize.Width, child.DesiredSize.Width);
                resultSize.Height += child.DesiredSize.Height;
            }

            totalHeight = resultSize.Height;

            resultSize.Width = double.IsPositiveInfinity(availableSize.Width) ?
                resultSize.Width : availableSize.Width;

            resultSize.Height = double.IsPositiveInfinity(availableSize.Height) ?
                resultSize.Height : availableSize.Height;

            return resultSize;
        }

        protected override Size ArrangeOverride(Size finalSize)
        {
            double y = (totalHeight <= finalSize.Height) ? 0 : ScrollOffset;
            foreach (UIElement child in Children)
            {
                if (y > totalHeight - child.DesiredSize.Height)
                    y -= totalHeight;

                child.Arrange(new Rect(0, y, finalSize.Width, child.DesiredSize.Height));
                y += child.DesiredSize.Height;
            }

            return finalSize;
        }
    }


Und der Test-XAML-Code:
ausblenden XML-Daten
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:
27:
28:
29:
30:
  xmlns:o="clr-namespace:WpfAnimatedList"
  xmlns:sys="clr-namespace:System;assembly=mscorlib"

[...]

      <ListView HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="120" Header="Datum" />
                <GridViewColumn Width="120" Header="Tag"  
           DisplayMemberBinding="{Binding DayOfWeek}" />
                <GridViewColumn Width="120" Header="Jahr"
           DisplayMemberBinding="{Binding Year}" />
            </GridView>
        </ListView.View>
        <sys:DateTime>1/2/3</sys:DateTime>
        <sys:DateTime>4/5/6</sys:DateTime>
        <sys:DateTime>7/8/9</sys:DateTime>
        <sys:DateTime>10/11/12</sys:DateTime>
        
        <ScrollViewer.VerticalScrollBarVisibility>
            disabled
        </ScrollViewer.VerticalScrollBarVisibility>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <o:AutoScrollStackPanel ScrollSpeed="0.5">
                </o:AutoScrollStackPanel>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ListView>