WPF 왜 Scaletransform이 얼어 붙은 이유는 무엇이며 어떻게 결합 할 수 있습니까?
-
21-09-2019 - |
문제
묶고 싶은 매우 간단한 사용자 컨트롤이 있습니다. 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);
효과가있다! 스케일을 적용합니다
그래서 두 가지 질문 :
- 내 변화는 왜 그런가?
Frozen
첫 번째 장소입니까? - 변환을 복제 할 때 왜 내 구속력이 작동하지 않습니까?
감사합니다!
업데이트:
다음은 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 : 클래스 속성이 포함된다고 가정합니다.