Domanda

Ho un controllo utente abbastanza semplice che voglio associare una proprietà ScaleTransform ad un DP nel codice dietro in questo modo:

<UserControl 
x:Name="RoundByRound"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
...
>

<Canvas x:Name="MyCanvas">
  <Canvas.RenderTransform>
    <TransformGroup>
      <ScaleTransform ScaleX="{Binding ZoomTransform.ScaleX, ElementName=RoundByRound}" 
                      ScaleY="{Binding ZoomTransform.ScaleY, ElementName=RoundByRound}"/>
      <SkewTransform/>
      <RotateTransform/>
      <TranslateTransform X="{Binding TranslateTransform.X, ElementName=RoundByRound}" 
                          Y="{Binding TranslateTransform.Y, ElementName=RoundByRound}"/>
     </TransformGroup>
   </Canvas.RenderTransform>
</Canvas>
</UserControl>

e poi nel codice dietro faccio questo:

ZoomTransform.ScaleX = 3;
ZoomTransform.ScaleY = 3;

Ma ho ottenuto un errore che dice:

  

Non è possibile impostare una proprietà sull'oggetto '...' perché è in uno stato di sola lettura.

Così ho cambiato in:

var cloned = ZoomTransform.Clone();
cloned.ScaleX = 3;
cloned.ScaleY = 3;
ZoomTransform = cloned;

Ma ora che in realtà non fa nulla ... nessuna scala viene applicato alla mia tela.

TUTTAVIA

Se rimuovere l'associazione alla ScaleTransform e solo come un elemento XAML vuoto:

<ScaleTransform />

Poi, nel mio codice faccio questo:

(MyCanvas.RenderTransform as TransformGroup).Children[0] = new ScaleTransform(3, 3);

Funziona! Ho la scala applicato

2 domande:

  1. Perché il mio Trasforma Frozen è il primo posto?
  2. Perché pretende molto il mio lavoro vincolante quando ho clonare il trasformare?

Grazie a tutti!

UPDATE:

Ecco la definizione del DP:

public static readonly DependencyProperty TranslateTransformProperty = DependencyProperty.Register("TranslateTransform",
            typeof(TranslateTransform),
            typeof(RoundByRoundControl),
            new PropertyMetadata(new TranslateTransform { X = 0, Y = 0 }));

        public static readonly DependencyProperty ZoomTransformProperty = DependencyProperty.Register("ZoomTransform",
            typeof(ScaleTransform),
            typeof(RoundByRoundControl),
            new PropertyMetadata(new ScaleTransform { ScaleX = 1, ScaleY = 1 }));

        public TranslateTransform TranslateTransform
        {
            get { return (TranslateTransform)GetValue(TranslateTransformProperty); }
            set { SetValue(TranslateTransformProperty, value); }
        }

        public ScaleTransform ZoomTransform
        {
            get { return (ScaleTransform)GetValue(ZoomTransformProperty); }
            set { SetValue(ZoomTransformProperty, value); }
        }
È stato utile?

Soluzione

Lo ScaleTransform che si passa come valore di default per la vostra proprietà ZoomTransform è congelato dal PropertyMetadata. Una volta che il PropertyMetadata è passato al metodo Registrati si saranno congelati / sigillato.

  

Tuttavia, una volta che i metadati si consuma   come parte di una chiamata a Registrati,   AddOwner o OverrideMetadata, il   sistema di proprietà che sigillerà   esempio metadati e le proprietà   sono ormai considerati immutabili.   Il tentativo di impostare una volta DefaultValue   IsSealed è vero su questi metadati   esempio solleverà un'eccezione.

Dato che lo ScaleTransform è un Freezable, è congelato come parte di questo processo.

Per quanto riguarda la seconda domanda si, in base al codice che hai fornito che si applica correttamente la ScaleTransform quando clonazione del ZoomTransform. Ci deve essere qualcos'altro che non è stato incluso.

Questo è supponendo che il codice XAML per l'UserControl include una x:. Attributo di classe che lega il file code-behind per RoundByRoundControl

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top