Laden...

XAML & Multibinding: Verwendung bei MatrixTransform

Erstellt von Kyaha vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.145 Views
K
Kyaha Themenstarter:in
3 Beiträge seit 2010
vor 13 Jahren
XAML & Multibinding: Verwendung bei MatrixTransform

Hallo alle miteinander,

ich bastle seit einiger Zeit daran, dass ich ein Binding an 3 Parameter eines UserControls realisiert bekomme.
Diese sind als DependencyProperties angegeben (ScaleX, ScaleY und Angle) und sollen das UserControl.RenderTransform mit einem MatrixTransform bestücken.

Ich habe auch einen soweit funktionierenden MutliValueConverter gebaut, der diese 3 Werte zu einer Matrix (oder halt ggf. auch etwas anderem) umwandeln kann.

Das Problem ist nun, dass ich diesen Converter nicht einfach eingebaut bekomme...
Bsp.:


    <UserControl.Resources>
        <local:MyDummyConverter x:Key="dmConverter" />
    </UserControl.Resources>

  <UserControl.RenderTransform>
        <MatrixTransform>
            <MatrixTransform.Matrix>
                <MultiBinding Converter="{StaticResource dmConverter}">
                    <Binding ElementName="dduc" Path="Angle" />
                    <Binding ElementName="dduc" Path="ScaleX" />
                    <Binding ElementName="dduc" Path="ScaleY" />
                </MultiBinding>
            </MatrixTransform.Matrix>
        </MatrixTransform>

    </UserControl.RenderTransform>

Soweit ich bisher herausgefunden habe, kann ich scheinbar der Matrix nichts zuweisen. Leider funktioniert es auch nicht wenn ich auf einzelne Matrix-Elemente versuche einzugehen. Ebensowenig wird der Versuch die MatrixTransform irgendwie aus dem Konverter zu ziehen und zuzweisen mit Erfolg gekrönt.

Hat vielleicht jemand eine zündende Idee oder einen Lösungsvorschlag für mich?

Besten Dank im voraus!

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Kyaha,

implementiert der Converter von IMultiValueConverter? Steht was im Output-Fenster?

zero_x

K
Kyaha Themenstarter:in
3 Beiträge seit 2010
vor 13 Jahren

Ja, den Konverter leite ich von IMultiValueConverter ab.

Ein rebuild funktioniert auch tadellos, einzig der Designer zeigt immer mal wieder einen Reflection bzw. einen InvalidCastException:

Hier die Fehlermeldung:

System.Reflection.TargetInvocationException
Exception has been thrown by the target of an invocation.
at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

System.InvalidCastException
Specified cast is not valid.
at DragDrop.MatrixConverter2.Convert(Object[] values, Type targetType, Object parameter, CultureInfo culture) in D:\Eigene Dateien\Visual Studio 2008\Projects\WpfApplication1\DragDrop\MatrixConverter.cs:line 37
at System.Windows.Data.MultiBindingExpression.TransferValue()
at System.Windows.Data.MultiBindingExpression.Transfer()
at System.Windows.Data.MultiBindingExpression.UpdateTarget(Boolean includeInnerBindings)
at System.Windows.Data.MultiBindingExpression.AttachToContext(Boolean lastChance)
at System.Windows.Data.MultiBindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance)
at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance)
at MS.Internal.Data.DataBindEngine.Run(Object arg)
at MS.Internal.Data.DataBindEngine.OnLayoutUpdated(Object sender, EventArgs e)
at System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
at System.Windows.ContextLayoutManager.UpdateLayout()
at System.Windows.UIElement.UpdateLayout()
at System.Windows.Interop.HwndSource.SetLayoutSize()
at System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value)
at System.Windows.Interop.HwndSource.set_RootVisual(Visual value)
at MS.Internal.DeferredHwndSource.ProcessQueue(Object sender, EventArgs e)

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo Kyaha,

vielleicht hilft dir hier das weiter.

zero_x

K
Kyaha Themenstarter:in
3 Beiträge seit 2010
vor 13 Jahren

Ich habe jetzt den Fehler gefunden.
Da wo er lag, hatte ich ihn wahrlich nicht erwartet.

Die Matrix (oder im anderen Converter: MatrixTransform) wird korrekt berechent wenn ich das Programm ausführe. Offensichtlich ist dies ein dummer Fhler im Designer, von dem ich mich habe verleiten lassen.

Das Problem besteht dadrin, dass das Casting von Object -> double dort nicht so recht funktionieren will - und das obwohl das Array von object[] values alles double values enthält (extra Typ geprüft).
Den lästigen Fehler bin ich jetzt dadurch losgeworden, dass ich die Objekte per .toString() zu strings konvertiere und dann mittels double.tryParse() wieder explizit zu double-Werten umwandele (normales double.Parse() funktioniert lustigerweise nicht!).

Eigentlich ist dies wirklich doppelt gemoppelt und unnötig, aber wenn der Designer sonst nicht funktionieren will...... Gibt es hierfür vielleicht eine bessere Lösung?

Besten Dank jedenfalls für die Lösungsvorschläge!

mfg

Kyaha