WPF 왜 Scaletransform이 얼어 붙은 이유는 무엇이며 어떻게 결합 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/2277399

문제

묶고 싶은 매우 간단한 사용자 컨트롤이 있습니다. ScaleTransform 그런 것과 같은 코드의 DP에 대한 속성 :

<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>

그런 다음 뒤에있는 코드에서 다음을 수행합니다.

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

하지만 오류가 발생했습니다.

객체 '...'에 속성을 설정할 수 없습니다. 읽기 전용 상태이기 때문입니다.

그래서 나는 그것을 다음으로 변경했습니다.

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

그러나 이제는 실제로 아무것도하지 않습니다 ... 내 캔버스에 스케일이 적용되지 않습니다.

하지만

내가 바인딩을 제거하면 ScaleTransform 빈 XAML 요소로 사용하십시오.

<ScaleTransform />

그런 다음 내 코드에서 다음을 수행합니다.

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

효과가있다! 스케일을 적용합니다

그래서 두 가지 질문 :

  1. 내 변화는 왜 그런가? Frozen 첫 번째 장소입니까?
  2. 변환을 복제 할 때 왜 내 구속력이 작동하지 않습니까?

감사합니다!

업데이트:

다음은 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); }
        }
도움이 되었습니까?

해결책

Zoomtransform 속성의 기본값으로 전달하는 ScaleTransform은 PropertyMetadata에 의해 동결됩니다. PropertyMetadata가되면 레지스터 방법으로 전달되었습니다 IS는 동결/밀봉됩니다.

그러나 메타 데이터가 등록, 부가자 또는 ResportemetAdata의 호출의 일부로 소비되면 속성 시스템은 메타 데이터 인스턴스를 봉인하고 속성은 이제 불변으로 간주됩니다. 이 메타 데이터 인스턴스에서 ISSEALED가 일단 DefaultValue를 설정하려고 시도하면 예외가 발생합니다.

ScaleTransform은 동결 가능 이므로이 프로세스의 일부로 동결됩니다.

두 번째 질문은 제공 한 코드를 기반으로 Zoomtransform을 복제 할 때 ScaleTransform을 올바르게 적용합니다. 당신이 포함하지 않은 다른 일이 있어야합니다.

이는 USERCONTROL의 XAML에 RoundByRoundControl의 Code-Behind 파일과 관련된 x : 클래스 속성이 포함된다고 가정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top