Laden...

Binding in Style und VisualBrush

Erstellt von Big Al vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.513 Views
B
Big Al Themenstarter:in
342 Beiträge seit 2006
vor 13 Jahren
Binding in Style und VisualBrush

Hallo,
ich versuche mich gerade an einer ProgressBar, die fünf Sterne statt des normalen Balkens anzeigt. Ich weiß, dass es da schon einige Lösungen gibt, aber ich dachte mir, dass meine eigentlich auch funktionieren müsste. Nur leider tritt hier ein komisches Phänomen auf. Hier erst einmal das XAML für den ProgressBar-Style. Da ich aber nur mein Problem demonstrieren möchte habe ich in PathData ein einfaches Rechteck statt der Sterne und im VisualBrush statt einer ProgressBar einen TextBlock drin. Außerdem ist im Grid noch ein weiterer TextBlock zur Veranschaulichung des Problems.


    <Style TargetType="ProgressBar" x:Key="starProgressBarStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ProgressBar">
                    <Grid>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value, Mode=OneWay}" Width="100"/>
                        <Viewbox>
                            <Path>
                                <Path.Fill>
                                <VisualBrush Stretch="Fill">
                                    <VisualBrush.Visual>
                                        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value, Mode=OneWay}" Width="100"/>
                                    </VisualBrush.Visual>
                                </VisualBrush>
                                </Path.Fill>
                                <Path.Data>
                                    <PathGeometry>
                                    <PathFigure StartPoint="0,0" IsClosed="True">
                                        <LineSegment Point="100,0"/>
                                        <LineSegment Point="100,100"/>
                                        <LineSegment Point="0,100"/>
                                    </PathFigure>
                                    </PathGeometry>
                                </Path.Data>
                            </Path>
                    </Viewbox>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Mein Problem ist nun, dass trotz exakt gleichem Code die beiden TextBlocks unterschiedliche Werte haben. Der TextBlock im VisualBrush wird nämlich bei Änderungen des Properties, an das er gebunden ist nicht geupdated und zeigt immer den ersten Wert. Der TextBlock im Grid zeigt allerdings immer den richtigen Wert an. Dieses seltsame Verhalten bereitet mir gerade einiges Kopfzerbrechen. Kennt jemand den Grund dafür?

Big Al

Da man Spatzen nicht mit Kanonen jagt, sollte man auch nicht mit Computern auf Spatzenhirne losgehen.

L
862 Beiträge seit 2006
vor 13 Jahren

Versuch doch mal mit Snoop die Elemente genau zu analysieren um herauszufinden ob es wirklich am Binding liegt oder ob sich vielleicht nur die VisualBrush nicht neu zeichnet.

Was passiert wenn du in der VisualBrush deinen TextBlock nicht erneut anlegst sondern per {Binding ElementName=textBlockImGrid} auf den bestehenden verweist der funktioniert? Löst das dein Problem?

B
Big Al Themenstarter:in
342 Beiträge seit 2006
vor 13 Jahren

Hi,
das muss ich gleich ausprobieren, wenn ich zu Hause bin. Von Snoop habe ich noch nie was gehört. Werde ich auch mal ausprobieren. Melde mich, wenn ich mehr weiß.
Danke erstmal,
Big Al

Da man Spatzen nicht mit Kanonen jagt, sollte man auch nicht mit Computern auf Spatzenhirne losgehen.

B
Big Al Themenstarter:in
342 Beiträge seit 2006
vor 13 Jahren

Hallo,
Snoop stürzt bei mir leider immer ab einer bestimmten Stelle im TreeView ab, deshalb konnte ich das Control nicht näher analysieren. Ich werde wohl mal eine extra Anwendung schreiben, die das Problem ohne große Controls drumherum veranschaulicht. Vielleicht funktioniert Snoop ja dann. Ich habe auch versucht, den TextBlock in VisualBrush an den äußeren zu binden und bin auf exakt dasselbe Ergebnis wie vorher gekommen. Wenn sich durch Änderungen in der gebundenen Klasse der Wert der ProgressBar ändert, ändert sich auch der Wert des ersten TextBlocks, nicht aber der des zweiten.
Zur weiteren Info: Der Style liegt in einer XAML-Ressourcen-Datei, aber das dürfte eigentlich keine Rolle spielen, denn das Binding des ersten TextBlocks funktioniert ja.
Big Al

//Edit: Es wird noch komischer: Ich habe den Style 1 zu 1 in ein neues Testprojekt übertragen und dort eine ProgressBar mit dem Style versehen und ihren Wert an einen Slider gebunden. Hier funktioniert es, in dem anderen Projekt nicht. Beide haben als Framework-Target 4.0.

Da man Spatzen nicht mit Kanonen jagt, sollte man auch nicht mit Computern auf Spatzenhirne losgehen.

B
Big Al Themenstarter:in
342 Beiträge seit 2006
vor 13 Jahren

Ihr werdet es nicht glauben, aber das Problem ist ein WindowsFormsHost mit eingebautem WinForms Control, welches wiederum ein FlashPlayer Control enthält. Warum das passier kann ich noch immer nicht sagen, aber wenn ich das Control rauslasse funktioniert es. Sehr seltsames Verhalten...

Vielleicht weiß ja einer eine Antwort auf dieses Mysterium, das würde mich sehr interessieren. Erst einmal nehme ich jetzt den FlashPlayer raus.

Big Al

Da man Spatzen nicht mit Kanonen jagt, sollte man auch nicht mit Computern auf Spatzenhirne losgehen.

L
862 Beiträge seit 2006
vor 13 Jahren

Hallo Big Al,

Wenn du die VisualBrush an einen funktionierenden TextBlock gebunden hast und die Brush immer noch ein falsches Ergebnis zeigt beweist dass doch schon mal dass der Fehler nicht daran liegt dass sich der TextBlock nicht aktualisiert sondern dass die Brush nicht gezeichnet wird.

Ich habe selbst noch nicht mit WinFormHosts gearbeitet weis aber dass WPF und WinForms ihre Bildschirmbereiche so einteilen dass nur eine der beiden Technologien auf einem Bereich zeichnen kann. Wenn du also über einen WinForms-Host ein WPF-Element darstellst zieht einer der beiden den Kürzeren und wird am Bildschirm nicht aktualisiert. Da ich nicht weis ob sich deine VisualBrush und dein WinFormsControl überlappen kann ich jetzt allerdings nicht mit Sicherheit behaupten ob diese Theorie hier zutrifft.

Snoop hat bei mir übrigens auch öfters mal die Angewohnheit abzustürzen wenn die Gui-Controls zu zahlreich werden.