WPF 스타일과 관련된 문제가 있습니다. DependencyProperty를 포함하도록 클래스를 사용하거나 준비해 봅시다. 내가 사용 거짓에 대한 exampleValue을 변경할 때, 지금이 문제를참조 유형에 대한 WPF 스타일 DependencyProperty
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
xmlns:custom="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<Style TargetType="{x:Type custom:MyTextBlock}">
<Setter Property="Background" Value="Aqua" />
<Setter Property="myProperty">
<Setter.Value>
<custom:MyProperty exampleValue="true" />
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
</Window.Resources>
<Grid RenderTransformOrigin="0.514,0.47" Margin="100,0,0,0">
<custom:MyTextBlock x:Name="textBlock1" Height="80" Width="80" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,104,62.8,0" />
<custom:MyTextBlock x:Name="textBlock2" Height="80" Width="80" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,200,62.8,0" />
</Grid>
</Window>
그리고 :
public class MyProperty : DependencyObject
{
public static readonly DependencyProperty exampleValueProperty = DependencyProperty.Register("exampleValue", typeof(bool), typeof(MyProperty));
public bool exampleValue
{
get { return (bool)this.GetValue(exampleValueProperty); }
set { this.SetValue(exampleValueProperty, value); }
}
}
public class MyTextBlock : TextBlock
{
public static readonly DependencyProperty myPropertyProperty= DependencyProperty.Register(
"myProperty", typeof(MyProperty), typeof(MyTextBlock));
public MyProperty myProperty
{
get
{
return (MyProperty)this.GetValue(myPropertyProperty);
}
set
{
this.SetValue(myPropertyProperty, value);
}
}
}
이제 XAML 파일에서 스타일을 정의 내 메인 창 그리드 클래스 MyTextBlock의 2 개 물건을 올려
textBlock1.myProperty.exampleValue = false;
textBlock2에 대해서도 exampleValue가 변경됩니다.
위에서 볼 수 있듯이 textBlock1.myProperty와 textBlock2.myProperty는 모두 동일한 hashCode를 반환합니다. 아마도 이것이 우리가 먼저 myProperty의 하나의 객체를 생성 한 다음 Setter가 각 MyTextBlock 객체에 복사 (복사)하기 때문에 발생했을 것입니다. 여기에서 복제를 사용할 방법이 있습니까? 그래서 모든 객체는 자신의 "myProperty"를 가질 것입니까?
내가 알고 (하지 솔루션 만이 해결 방법처럼 보인다) 나는 개체 당 내 속성을 정의하면, 제대로 작동의 뜻이 하나
<custom:MyTextBlock x:Name="textBlock1" Height="80" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,104,62.8,0">
<custom:MyTextBlock.myProperty>
<custom:MyProperty exampleValue="False"/>
</custom:MyTextBlock.myProperty>
</custom:MyTextBlock>
<custom:MyTextBlock x:Name="textBlock2" Height="80" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,200,62.8,0">
<custom:MyTextBlock.myProperty>
<custom:MyProperty exampleValue="False"/>
</custom:MyTextBlock.myProperty>
</custom:MyTextBlock>
스타일은 어디에 정의되어 있습니까? x : Shared를 설정 했습니까? – Brannon
좋아요! 그것은 작동합니다. x가 누락되었습니다 : Shared = "False"내 스타일. – Rafal
비공유의 단점 : 당신이 원하는 스타일 일 수도 있고 그렇지 않을 수도있는, 많은 복제 스타일과 오브젝트를 만드는 길에 있습니다. 'MyProperty'를'Freezable'로 만들면, 코드의 값을 변경하려고 할 때 새로운 속성 인스턴스를 만들어야합니다. – grek40