Laden...

Forenbeiträge von ByteDevil Ingesamt 132 Beiträge

26.10.2017 - 21:01 Uhr

Hallo T-Virus,

danke für deinen Post 😃

Also handelt es sich um eine Collection von Decorator Collections?^^

Gibt es vielleicht eine elegantere Lösung als meine? Das scheint nicht immer zu 100% zu funktionieren.

Also einfach nur herausfinden, ob in einer TextDecorationCollection die Vordefinierten TextDecoratorCollection's "TextDecorations.Strikethrough" und/oder "TextDecorations.Underline" enthalten sind?

Viele Grüße,
ByteDevil

25.10.2017 - 17:36 Uhr

Hallo,

ich habe einen TextBlock welcher unter umständen zur Laufzeit einen Underline decorator bekommt. Nun möchte ich herausfinden, ob der Text unterstrichen ist, oder eben nicht.

Das wollte ich so machen:

if (myTextBox.TextDecorations.Contains(TextDecorations.Underline))
                //mach was

Die Constains-Methode der TextDecorationCollection erwartet wie vermutet eine TextDecoration. Die Klasse TextDecorations beinhaltet aber auch nur TextDecorationCollection's... Sprich TextDecorations.Underline ist keine TextDecoration, sondern eine TextDecorationCollection...und das verstehe ich nicht.

Danke im Vorraus.

Edit: Okay, habs durch raten selbst herausgefunden...

if (myTextBox.TextDecorations.Contains(TextDecorations.Underline[0]))
                //mach was

Trotzdem irgendwie seltsam.

27.03.2017 - 20:18 Uhr

Hi MrSparkle,

danke für den Hinweis, aber das hatte ich bereits versucht. Ich erhielt jedes mal eine Exception wenn ich das versucht hatte. "Dieses Element wird von einem anderen Thread verwendet" oder sowas in der Art. Dispatcher.Invoke() hat daran auch nichts geändert.

26.03.2017 - 19:46 Uhr

Nein den Artikel meinte ich. Habe ihn auch vor geraumer Zeit schonmal gelesen und damit erfolgreich eine Anwendung gebastelt die Databinding nutzt. Das Beispiel mit dem DataTemplate verstehe ich allerdings nicht so ganz...zumindest nicht auf welches Control du dich da beziehst.

Habe es jetzt so gelöst wie du in deinem ersten Beitrag geraten hast. Bin zwar nicht so Glücklich mit der Lösung, aber es funktioniert.

Danke für deine Zeit.

LG

26.03.2017 - 18:42 Uhr

Im Internet finde ich auch ausschließlich Beispiele für Buttons...deren Form irgendwie geändert wird oder ähnliches -.-

Ernsthaft? In dem oben verlinkten Artikel gibt es Beispiele für DataTemplates für Buttons und andere Klassen. Es gibt übrigens Unterschiede zwischen ControlTemplates und DataTemplates (siehe Artikel). Und wenn dir die Möglichkeiten eines Templates nicht ausreichen, kannst du immernoch ein UserControl erstellen.

Anscheinend hab ich Tomaten auf den Augen...finde in dem von dir verlinkten Artrikel in Teil 5. Templates nur Beispiele für Buttons. Dort baust du doch auch einen komplett neuen Button zusammen. Ich will einfach nur Text in meiner ProgressBar ohne sie sonst zu verändern 😦

<ProgressBar x:Name="progressBar" DockPanel.Dock="Bottom" Height="20">
            <ProgressBar.Template>
                <ControlTemplate>
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
                        Das ist ein Text
                    </TextBlock>
                </ControlTemplate>
            </ProgressBar.Template>
        </ProgressBar>

Dieser Code lässt einfach nur einen leeren Balken da stehen der den Text enthält...kein Progress wird mehr angezeigt.

26.03.2017 - 18:23 Uhr

Ich muss aber doch auch von aussen irgendwie Dinge wie Schriftgröße usw festlegen können. Also Sachen die ich an nichts binden möchte.
Ich müsste dem Control also (via XAML?!) neue Properties verpassen mit denen ich (vielleicht auch via Code Behind) den Text in allen erdenklichen Belangen anpassen kann. Geht das wirklich mit einem Template?

Zitat von ByteDevil:
Müsste ich bei einem Template nicht auch das Design des gesamten ProgressBars neu machen?

Nein, warum?

Also ich habe bisher nur mal ein Template für einen Button geschrieben und wenn ich ein leeres Template einem Button zuweise, ist dort nichts mehr zu sehen. Ich musste also das gesamte Steuerelement neu designen. Im Internet finde ich auch ausschließlich Beispiele für Buttons...deren Form irgendwie geändert wird oder ähnliches -.-

26.03.2017 - 18:00 Uhr

Aber wie komme ich dann von aussen an den Text wenn ich zB ein ControlTemplate dafür schreibe und einen Textblock hinein setze.
Müsste ich bei einem Template nicht auch das Design des gesamten ProgressBars neu machen?

26.03.2017 - 17:16 Uhr

Hi MrSparkle,

Danke für deine Antwort.
Ich hätte es nur ganz gern so gelöst, da ich diesen ProgressBar auch noch an anderen Stellen wiederverwenden möchte.

26.03.2017 - 12:19 Uhr

Hallo,

kann mir jemand sagen was ich falsch mache? Der Text wird nicht dargestellt.

using System.Globalization;
using System.Windows.Controls;
using System.Windows.Media;

namespace Test
{
    public enum TextDisplayMode { Percentage, CustomText }

    class ProgressBarWithText : ProgressBar
    {
        public string Text { get; set; }
        public TextDisplayMode TextDisplayMode { get; set; }

        public ProgressBarWithText() { TextDisplayMode = TextDisplayMode.Percentage; }

        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);

            string text = TextDisplayMode == TextDisplayMode.Percentage ? (Value / Maximum * 100) + "%" : Text;

            FormattedText fText = new FormattedText(text,
                    CultureInfo.CurrentCulture,
                    System.Windows.FlowDirection.LeftToRight,
                    new Typeface("CourierNew"),
                    12,
                    Brushes.Black);

            drawingContext.DrawText(fText, new System.Windows.Point(ActualWidth / 2 - fText.Width / 2, ActualHeight / 2 - fText.Height / 2));
        }
    }
}
26.03.2017 - 09:34 Uhr

Ich habe des Rätsels Lösung selbst gefunden 😃 (Auch wenn ich mir sicher war das schon versucht zu haben 😕 )

Einfach die Property "ShutdownMode" der Application auf ShutdownMode="OnMainWindowClose" setzen. Nun funktioniert alles reibungslos. Ich hoffe, das nützt jemandem etwas.

Trotzdem danke 😃

LG

EDIT: Tja, zu früh gefreut. Jetzt schließt sich die Application nicht - auch wenn ALLE Fenster geschlossen wurden -.- Ich kriege die Krise

EDIT2: Okay, auch das ließ sich lösen. Ich dachte ich müsste das Hauptfenster in einem eigenen STA-Thread laufen lassen. Ist aber nicht nötig. Es im Hauptthread laufen zu lassen behebt auch diesen Fehler.

25.03.2017 - 19:56 Uhr

Hallo liebe Community,

ich hoffe, ich bin im richtigen Unterforum gelandet.
Mein Problem ist folgendes:

Ich möchte einen Splashscreen anzeigen lassen welcher ein Image und einen ProgressBar besitzt. Es werden einige Daten in einer weiteren Klasse namens HardwareInfo zusammengetragen und via Event, welches in dieser Klasse implementiert ist, soll der Progressbar gefüllt werden. Ist alles fertig, wird das Event FinishedInit gefeuert und es soll der Splashscreen geschlossen und das MainWindow geöffnet werden. Mit unten stehendem Code bekomme ich aber im Konstruktor des Hauptfensters eine InvalidOperationException mit dem ergänzenden Hinweis "Das Anwendungsobjekt wird beendet."
Was kann ich tun? Habe schon so vieles ausprobiert und Google um rat gefragt...


using System.Threading;
using System.Windows;

namespace Test
{
    public partial class App : Application
    {
        SplashScreen s = new SplashScreen();

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            HardwareInfo hwi = HardwareInfo.GetInstance();
            hwi.UpdateProgress += Hwi_UpdateProgress;
            hwi.FinishedInit += Hwi_FinishedInit;            

            Thread t = new Thread(hwi.Init);
            t.Start();

            s.ShowDialog();

            Thread mainThread = new Thread(() =>
            {
                MainWindow mainWindow = new MainWindow();
                mainWindow.Show();

                Dispatcher.Invoke(() => { MainWindow = mainWindow; });

                System.Windows.Threading.Dispatcher.Run();
            });
            mainThread.SetApartmentState(ApartmentState.STA);
            mainThread.Start();
        }

        private void Hwi_FinishedInit(FinishedInitEventArgs e)
        {
            Dispatcher.Invoke(() => { s.Close(); });
        }

        private void Hwi_UpdateProgress(InitProgressEventArgs e)
        {
            Dispatcher.Invoke(() => { s.progressBar.Value = e.Progress; });
        }
    }
}

Vielen Dank im Voraus für eure Hilfe.

LG

18.12.2016 - 00:09 Uhr

Der Fehler tritt in der Methode

private void ChildPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            this.OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset));
        }

auf.

Dafür gibt es doch bereits die Implementierung der INotifyPropertyChanged-Schnittstelle.

Also so wie ich es oben gemacht habe, wird meine listview nicht aktualisiert wenn ich dieses Event nicht feuere.

Was du mir da geschickt hast sieht sehr interessant aus aber wirklich kürzer ist es auch nicht 😕 Und das hier entspricht doch auch diesem Muster, oder?

17.12.2016 - 23:55 Uhr

@MrSparkle:

Hi, der Fehler tritt auf wenn du ein Item aus der Listbox selektierst, dann entweder den Slider oder den Text veränderst und dann 2 oder 3 mal ein anderes Item auswählst. Du wirst feststellen das Slider und Textbox nicht mehr aktualisiert werden und dann wird die von mir genannte Exception geworfen. Wenn du die GetHashCode() Methode auskommentierst, funktioniert alles prima.

Das CollectionChanged ereignis löse ich aus, damit sich meine Listview auch aktualisiert wenn sich eine Eigenschaft eines Elementes geändert hat. So wird es nur ausgelöst wenn ein Element aus der Liste gelöscht oder hinzugefügt wird.

@Sir Rufo:

Wie meinst du das? Inwiefern geht das einfacher?

Erreichen möchte ich eigentlich jetzt nur noch das ich erleuchtet werde wofür ich die GetHashCode Methode überschreiben soll und wie ich das korrekt mache ohne das sich mein Programm damit abschießt. Denke mir halt das sich die Jungs und Mädels bei Microsoft schon was dabei gedacht haben warum sie damit rumnerven^^

Und wenn ihr noch Tips habt wie ich das Databinding schöner hinbekomme, dann immer her damit 😃

Grüße,
ByteDevil

17.12.2016 - 19:14 Uhr

Hallo Sir Rufo,

nein ich denke deine Augen sind ok 😉 Hatte ich in meinem Beispiel tatsächlich vergessen und jetzt noch hinzugefügt.

Hm und könnte das zu Problemen führen wenn ich das einfach unter den Tisch fallen lasse?

Grüße,
ByteDevil

PS: Gleichheit definiere ich hier wie in der == überladung. Alle Felder der Klasse sind gleich.

17.12.2016 - 18:53 Uhr

Hallo liebe Community,

ich schreibe gerade an etwas wo ich Databinding (WPF) nutze. Die von mir gekapselte Klasse hat eine Überladung des == und != operators. Laut MSDN sollte man dazu auch Equals und GetHasCode() überschreiben. Das habe ich getan und mich dabei auch an die Richtlinien von Microsoft gehalten. Führe ich meinen Code aber nun aus, kriege ich kurze Zeit nach dem ändern eines Datensatzes folgende ArgumentException: "Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt."

Kommentiere ich meine selbst geschriebene GetHashCode() Methode aus, so funktioniert alles prima aber ich erhalte eben eine Warnung das ich sie unbedingt überschreiben sollte.

Kann mir jemand erklären was ich falsch gemacht habe und warum genau ich diese Methode unbedingt überschreiben soll?
Ich hänge mal ein verkürztes Codebeispiel an das den Fehler reproduziert.

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace WpfApplication2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            KlassenKapselungCollection c = this.FindResource("klasse") as KlassenKapselungCollection;
            c.Add(new KlassenKapselung("Das ist ein Test", 66.6));
            c.Add(new KlassenKapselung("Bla bla bla", 33.3));
            c.Add(new KlassenKapselung("Noch ein Test", 100));
        }
    }

    class KlassenKapselung : INotifyPropertyChanged
    {
        private double d;
        public double D
        {
            get { return d; }
            set
            {
                if (d != value)
                {
                    d = value;
                    OnPropertyChanged("MeinDouble");
                }
            }
        }


        private string s;
        public string S
        {
            get { return s; }
            set
            {
                if (s != value)
                {
                    s = value;
                    OnPropertyChanged("MeinString");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string info)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            handler?.Invoke(this, new PropertyChangedEventArgs(info));
        }

        public KlassenKapselung(string s, double d)
        {
            this.s = s;
            this.d = d;
        }

        public override string ToString()
        {
            return s + " | " + d;
        }

        public static bool operator ==(KlassenKapselung a, KlassenKapselung b)
        {
            if (ReferenceEquals(a, b))
                return true;

            if (((object)a == null) || ((object)b == null))
                return false;

            return a.s == b.s && a.d == b.d;
        }

        public static bool operator !=(KlassenKapselung a, KlassenKapselung b) { return !(a == b); }

        public override int GetHashCode()
        {
            return s.GetHashCode() ^ d.GetHashCode();
        }
    }

    class KlassenKapselungCollection : ObservableCollection<KlassenKapselung>
    {
        public KlassenKapselungCollection() : base() { }

        public new void Add(KlassenKapselung s)
        {
            base.Add(s);
            s.PropertyChanged += ChildPropertyChanged;
        }

        public new void RemoveAt(int index)
        {
            this[index].PropertyChanged -= ChildPropertyChanged;
            base.RemoveAt(index);
        }

        public new void Clear()
        {
            foreach (KlassenKapselung s in this)
                s.PropertyChanged -= ChildPropertyChanged;
            base.Clear();
        }

        private void ChildPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            this.OnCollectionChanged(new System.Collections.Specialized.NotifyCollectionChangedEventArgs(System.Collections.Specialized.NotifyCollectionChangedAction.Reset));
        }
    }
}
<Window x:Class="WpfApplication2.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:WpfApplication2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:KlassenKapselungCollection x:Key="klasse"/>
    </Window.Resources>
    <Grid>
        <ListView x:Name="listView" SelectionMode="Single" HorizontalAlignment="Left" Height="170" Margin="67,21,0,0" VerticalAlignment="Top" Width="322" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Source={StaticResource klasse}, Mode=OneWay}"/>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="67,220,0,0" TextWrapping="Wrap" Text="{Binding Source={StaticResource klasse}, Path=S, Mode=TwoWay}" VerticalAlignment="Top" Width="120"/>
        <Slider x:Name="slider" HorizontalAlignment="Left" Margin="216,225,0,0" VerticalAlignment="Top" Width="154" Maximum="100" Value="{Binding Source={StaticResource klasse}, Path=D, Mode=TwoWay}"/>
    </Grid>
</Window>

Ich habe eben einfach sämtliche Felder mit einem XOR verknüpft...wie im MSDN gezeigt...

https://msdn.microsoft.com/de-de/library/ms173147(v=vs.90).aspx

30.11.2016 - 10:51 Uhr

Vielen lieben Dank p!lle 😃 Werde ich ausprobieren!

Grüße,
ByteDevil

13.11.2016 - 11:03 Uhr

Hallo liebe Community,

ich möchte eine Texteingabe erstellen welche die Numeric-Tastatur anzeigt aber ohne die Kommataste und es soll eben möglich sein auch Punkte einzugeben. Auch wäre es schön, wenn ich einzelne Buttons deaktivieren könnte, wenn sie an aktueller Stelle der Eingabe keinen Sinn machen würden.

Ist das möglich ohne das ich mir ein komplett neues Control dafür basteln muss? Und wenn da kein Weg drum herum führt, von welcher Basisklasse würdet ihr erben?

Grüße,
ByteDevil

28.08.2016 - 10:03 Uhr

Ja danke euch 😃 Jetzt hab ich es kapiert. War mir nicht bewusst das dort solch eine Verzögerung im Gange ist.

Bei diesem kleinen Beispielcode ist es tatsächlich so, das die Berechnung sogar langsamer wird wenn ich für jede der Zeilen einen neuen Thread starte...war mir aber klar das es mit Kanonen auf Spatzen schießen ist. Das war wie gesagt nur als Beispiel. Meine echte Berechnung ist aufwändiger und dort habe ich tatsächlich die benötigte Zeit pro Berechnung um fast 85% reduzieren können...denn vorher schlief meine CPU fast ein^^

Aber auch unbegrenzt viele Threads öffnen zu lassen war nicht so optimal. Weniger ist auch hier teilweise mehr. Hab es nun so gemacht, dass maximal so viele Berechnungs-Threads gestartet werden, wie CPU-Kerne vorhanden sind (in meinem Fall 12).

Nochmal ein dickes Danke an alle 😃

Grüße,
ByteDevil

28.08.2016 - 01:20 Uhr

Danke Palladin007 😃

Ich habe deinen Rat beherzigt und einfach zu beginn der Schleife den Schleifenzähler zwischengespeichert. Nun funktioniert es perfekt und die Berechnung läuft fast 10 mal so schnell wie mit nur einem Thread 😃

Liebe Grüße,
ByteDevil

28.08.2016 - 00:32 Uhr

Wie meinst du das sie teilen sich die y-Variable? Die in CalcRow und der Main-Methode haben doch nichts miteinander zu tun. Auch wenn ich y in CalcRow umbenenne, ändert das nichts an dem Verhalten.

Wie kann ich denn Parallel.For auf eine methode mit Parameter anwenden?

27.08.2016 - 23:47 Uhr

Hallo liebe Community,

ich hoffe ihr könnt mir auch diesmal wieder helfen...ich hab ein großes Verständnisproblem und war schon drauf und dran den Exorzisten wegen meines PC's zu rufen 😕

Ich habe ein Programm geschrieben das Fraktale generiert. Das wollte ich nun beschleunigen, indem ich die Berechnung auf mehrere Threads verteile. Dabei passiert etwas das ich mir beim besten Willen nicht erklären kann. Ich habe mal einen kurzen Beispielcode geschrieben, der den Fehler in wenigen Zeilen reproduziert. Auf dem Screenshot seht ihr wie er sich verhält. Hier auch nochmal für Copy & Paste:


using System;
using System.Threading;

namespace Multithread_test
{
    class Program
    {
        static int[,] matrix;
        static int runningThreads = 0;

        static void Main(string[] args)
        {
            matrix = new int[1000, 1000];

            for (int y = 0; y < 1000; y++)
            {
                Thread thread = new Thread(delegate () { CalcRow(y); });
                thread.Start();
                runningThreads++;
            }

            while (runningThreads > 0)
                Thread.Sleep(10);

            Console.WriteLine("Fertig!");
            Console.ReadKey();
        }

        static void CalcRow(int y)
        {
            Console.WriteLine("Bearbeite Zeile " + y);
            for (int x = 0; x < 1000; x++)
                matrix[x, y] = x * y;
            runningThreads--;
        }
    }
}

Ich probiere nun schon seit Stunden rum...wie kann es sein das mehrere Threads mit dem gleichen Parameter für y aufgerufen werden? Auch wird die Methode mit y-Werten über 999 aufgerufen, was doch laut der Abbruchbedingung der Schleife gar nicht sein kann!?
Einige Zeilen werden auch einfach übersprungen und gar nicht berechnet.

Bitte erleuchtet mich...

Viele Grüße,
ByteDevil

24.08.2016 - 12:51 Uhr

Oh Gott ich schäme mich gerade 😄

ErfinderDesRades & Spook ihr habt beide recht. Ich hab base.OnRender() erst nacht meinem Code aufgerufen und natürlich wird dann das Ganze über meinem Rahmen gezeichnet 😕

Ich danke euch 😃

24.08.2016 - 12:36 Uhr

Hallo pinki,

danke für den Hinweiß, aber ich finde hier nur wenige Links in denen es um ein Canvas geht. Kannst du mir vielleicht noch einen genaueren Tipp geben?
Am liebsten wäre mir natürlich eine Methode um die Zeichenreihenfolge des Image-Controlls zu verändern...

24.08.2016 - 10:43 Uhr

Hi liebe Community,

ich habe eine Klasse geschrieben die von System.Controls.Image erbt. Dort möchte ich in OnRender einen Rahmen mit der Maus zeichnen (der User soll etwas Selektieren können).

Soweit kein Problem, doch wird mein Rahmen unter dem Bild angezeigt was über die Eigenschaft "Source" zugewiesen wird. Kann ich diesem Control das Verhalten irgendwie abgewöhnen? Vielleicht gibt es eine Layerreihenfolge?
Google konnte mir leider nicht helfen 😕

Vielen Dank,
Bytedevil

17.04.2016 - 20:25 Uhr

Hi,

ich habe einen recht kuriosen Fehler mit dem ich allein irgendwie nicht so ganz fertig werde.

Ich habe via NuGet ein WPF-Theme installiert, das wohl sowohl im Silverlight-Toolkit als auch im WPF-Toolkit vorkommt.

Wenn ich nun in den Designer gehe, bekomme ich die Fehler die ihr auf dem angehängen Screenshot sehen könnt.

Wenn ich das ganze compiliere, ist alles wunderbar...nur der designer ist so verkorkst. Das nervt mich wirklich tierisch 😦

Habt ihr eine Idee was falsch ist? Fehlen irgendwelche Verweise?

Das Paket heißt bei NuGet "Wpf.Themes.ExpressionDark" und die Quelle ist nuget.org.

Die ersten beiden Controls sind Progressbars und das untere ist ein TabControl. Ich verwende das Visual Studio 2015 Community.

Grüße,
BD

31.08.2013 - 10:21 Uhr

Hallo herbivore,

danke für die Links 😃 DoubleBuffered habe ich schon versucht. Den rest muss ich noch ausprobieren.

Mit zappeln meine ich aber nicht nur flackern sondern ist auch der unangenehme effekt, das der Text im tabcontrol erst angezeigt und DANN zentriert wird....somit springt mein text immer von links nach rechts. Ich denke nicht, dass das ein problem ist das sich durch DoubeBuffered etc lösen lässt. Das sieht natürlich schrecklich hässlich aus.

In den TabPages befinden sich ausserdem je ein Panel das AutoScroll True hat und sehr viele Labels, Textboxen und auch einige PictureBoxen enthält. Immer wenn ich den Text der TabPage ändere "Vibriert" die Scrollbar. Keine grafikfehler oder so...sie wackelt einfach^^

Naja ich denke ich werde mal ausprobieren die Frames des Gifs zu zerlegen und wie du vorgeschlagen hast mit einer Timercomponente zu laden. Dann muss ich den Text nicht mehr ändern. Interessant zu wissen wäre natürlich trotzdem wie man dieses Problem löst.

Ich danke dir auf jedenfall sehr 😃

LG ByteDevil

30.08.2013 - 15:40 Uhr

Hallo,

zerbrechen mir schon seit einiger Zeit den Kopf darüber, wie ich nachdem ich zur Laufzeit den tabPage.Text geändert habe, diesen auch danach zentriere. Warum das nicht automatisch passiert ist mir auch schleierhaft...

Zur eigenschaft von TabPage.Text steht in der MSDN Hilfe:

Durch Ändern des Text-Eigenschaftswerts wird der neue Wert nicht automatisch auf der Registerkarte zentriert, wenn das TabControl einen SizeMode-Eigenschaftswert von Fixed besitzt. Sie können diese Einschränkung umgehen, indem Sie die TabControl.ItemSize-Eigenschaft festlegen oder die TabPage aus der TabControl.TabPages-Auflistung entfernen und dann wieder der Auflistung hinzufügen. In beiden Fällen wird der Text automatisch zentriert.

Beide dort genannten lösungsvorschläge sind unschön weil dabei das ganze TabControl am zappeln ist...

Kennt jemand ein workaround?

Wenn nicht: gibt es eine möglichkeit neben dem Text der tabpage ein Animiertes Gif zu zeigen? Wenn ich eins über ne Imagelist hinzufüge, ist nur der erste Frame zu sehen. Bewegt sich also nix.

24.08.2013 - 09:45 Uhr

@chilic
AutoSize ist aber bei mir nötig. Sonst hast du sicher recht.

Edit: Ah habs hinbekommen, danke 😃 Im designer code muss man noch festlegen das das neue Panel nicht vom Typ des normalen Panels ist, sondern vom neuen Panel Typ.

Ich danke euch allen 😃

24.08.2013 - 07:50 Uhr

Hallo herbivore,

Ich habe explizit nach "Panel" und nicht autoscroll gesucht. Das war wohl der Fehler. Wusste nicht das es sich mit allen Scrollable Controls so verhält.

Danke dir. Aber kann ich

protected override Point ScrollToControl(Control activeControl)
{
    return base.ScrollToControl(this);
}

Auch zur Laufzeit noch overriden? Habe nämlich sehr viele Controls in meinem Panel welches ich im Designer erstellt habe. Sonst müsste ich ja alles löschen und das Label und alle controls darin zur Laufzeit im code erstellen, oder? Das wäre ein enormer Aufwand 😦

23.08.2013 - 22:23 Uhr

Guten Tag,

Ich habe ein Problem. Die Suche via google und hier im Forum hat mich leider nicht auf die richtige Spur gebracht.

Ich habe auf meiner Form ein normales Label. Der Text des Labels wird vom Code aus (Timer on tick) sekündlich aktualisiert. Auf der Form befindet sich ausserdem ein Panel welches eine Textbox beinhaltet. Das Panel ist auf AutoScroll eingestellt und die TextBox befindet sich so weit unten, das man runter scrollen müsste um sie zu sehen.

Wenn ich nun nach oben scrolle und die textbox nicht zu sehen ist, sie aber den Fokus hat weil der Cursor drin ist, scrollt bei jeder aktualisierung des labels die scrollbar vom panel immer runter zur textbox.

Wie gesagt...das Label ist NICHT im panel. Das sitzt auf der Form genau wie das Panel.

Nehme ich statt einem label eine Textbox um den Wert darzustellen, tritt der Fehler nicht auf.

Ich würde das Label aus ästhetischen Gründen ungern durch eine Readonly Textbox ersetzen...

Kennt jemand eine Lösung für mein Problem? Konnte weder beim Label noch bei der Textbox eine Eigenschaft finden, die dieses Verhalten abstellt. Habe ich was übersehen?

LG ByteDevil

Edit: Der Fehler tritt auch bei Labels auf die mit im Panel sind. Auch das ist ein Problem für mich.

Edit2: Ich konnte das Problem eingrenzen:
Der Fehler lässt sich mit allen Controls und nicht nur mit einem Label reproduzieren. Es geschieht wenn ein Control seine Width oder Height eigenschaft ändert. Das geschieht ja bei einem Label wenn sich der Text ändert. Bei einer Textbox nicht.

02.03.2013 - 19:32 Uhr

Vielen dank für die Hilfe 😃 das man mit dem schlüsselwort "as" dem ganzen direkt sagen kann um was es sich handelt wusste ich noch nicht. Wieder was gelernt 😃 Dankeschön

02.03.2013 - 12:14 Uhr

Hallo 😃

Ich habe eine Frage...ich habe eine WPF-Anwendung die ein Stackpanel enthält. In diesem Stackpanel sind mehrere Expander welche wiederum je ein Stackpanel enthalten. In diesen Stackpanels befinden sich mehrere Checkboxen. Ich möchte mir nun alle Checkboxen aus allen Expandern auflisten lassen. Ich möchte an die IsChecked und die Content Eigenschaft der Checkboxen kommen.

Kann mir dabei jemand helfen?

mit folgendem Code kann ich mir alle Expander auflisten lassen:


foreach (Expander E in Stack0.Children)
            {
                MessageBox.Show(E.Header.ToString());
            }

möchte ich nun aber weiter gehen:


foreach (Expander E in Stack0.Children)
            {
                foreach (StackPanel S in E.Content) //foreach ist ja eigentlich quatsch weil ja eh nur 1 
                                                       //Control darin sein kann aber was soll ich sonst machen?
                {
                }
            }

bekomme ich folgende Fehlermeldung:

Fehler 1 Eine foreach-Anweisung kann nicht für Variablen vom Typ "object" verwendet werden, da "object" keine öffentliche Definition für "GetEnumerator" enthält.

(Stack0 heißt das oberste StackPanel welches alle Expander enthält.)

Was vermutlich daran liegt das die Content-eigenschaft eines Expanders nur 1 Control beinhalten kann, richtig? Ich müsste irgendwie auf das zweite Stackpanel das im Expander steckt zugreifen können...nur wie?