2017-01-05 12 views
3

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

스타일은 어디에 정의되어 있습니까? x : Shared를 설정 했습니까? – Brannon

+0

좋아요! 그것은 작동합니다. x가 누락되었습니다 : Shared = "False"내 스타일. – Rafal

+0

비공유의 단점 : 당신이 원하는 스타일 일 수도 있고 그렇지 않을 수도있는, 많은 복제 스타일과 오브젝트를 만드는 길에 있습니다. 'MyProperty'를'Freezable'로 만들면, 코드의 값을 변경하려고 할 때 새로운 속성 인스턴스를 만들어야합니다. – grek40

답변

1

당신이 그것을 만들 수 있기 때문에 그것은 "MyProperty"의 동일한 인스턴스이다 자원으로. 그리고 리소스는 기본적으로 공유/정적입니다. 어쩌면 설정 : false로 "X 공유"를, 도움이 될 수 있습니다 :

어쨌든
<ResourceDictionary> 
    <Style TargetType="{x:Type custom:MyTextBlock}" x:Shared="false"> 
     <Setter Property="Background" Value="Aqua" /> 
     <Setter Property="myProperty"> 
      <Setter.Value> 
       <custom:MyProperty exampleValue="true" /> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

I, 그것은 트릭을 할 것입니다 확실하지 않다는 기본, 당신의 MyTextBlock 제어의 열쇠가없는 스타일 그리고 그것은 어쨌든 캐시 할 수 있기 때문에 .

"MyValueBlock"컨트롤마다 하나의 MyProperty 인스턴스가 있지만 "exampleValue"와 동일한 값을 유지하는 것보다 작동하는 경우.

EDIT : 죄송합니다. @Brannon 님의 의견이 없습니다.)