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!
Hallo Kyaha,
implementiert der Converter von IMultiValueConverter? Steht was im Output-Fenster?
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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)
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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