2009-11-07 1 views
1

캔버스의 하위 항목 인 기존 항목이 있습니다. 항목의 스타일은 항목을 색칠하는 데 사용할 수있는 다양한 브러시가 들어있는 리소스 사전에 포함되어 있습니다.XAMLReader를 사용하여 WPF 업데이트 컨트롤

항목의 인스턴스를 만들 때 기본 채색이 지정됩니다. 내가 직접 같이 채우기 속성과 상호 작용하는 현재 수 없습니다입니다 :

item.Fill = BrushBlue; 

내가 항목의 각 인스턴스에 대한 XAML에서 찾기 시작 이러한 이유로.

내가 만든 인스턴스 후 항목에 관심 오전 XAML은 다음과 같습니다

<d:Item IsSelected="True" Width="78" Height="65" Panel.ZIndex="0" Canvas.Left="233"  Canvas.Top="352.54"> 
    <Path ToolTip="Process"> 
     <Path.Style> 
      <Style TargetType="Path"> 
       <Style.BasedOn> 
        <Style TargetType="Path"> 
         <Style.Resources> 
          <ResourceDictionary /> 
         </Style.Resources> 
         <Setter Property="Shape.Fill"> 
          <Setter.Value> 
           <DynamicResource ResourceKey="ItemBrush" /> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </Style.BasedOn> 
      </Style> 
     </Path.Style> 
    </Path> 
. 
. 
. 
</d:Item> 
내가 이상적으로 항목의 인스턴스의 속성에 Shape.Fill 값을 묶을 수 있도록하고 싶습니다

, 또는 적어도 응용 프로그램에서 사용자 선택에 따라 그 값을 변경할 수 있어야합니다.

항목의 XAML을 편집하여 채우기 색상을 변경합니다. 내가 MSDN에서 버튼 복제 샘플을 기반으로, 다음 코드를 사용하고이를 달성하기 위해 : 나는 브러시 리소스 이름을 업데이트합니다 XAML을 받고 다음 새 항목을 생성하고

string savedItem = XamlWriter.Save(this) as String; 

string newItem = savedItem.Replace(GetFillBrush(this), "BrushBlue"); 
SetFillBrush(this, "BrushBlue"); 

StringReader stringReader = new StringReader(newItem); 
XmlReader xmlReader = XmlReader.Create(stringReader); 

thisCanvas.Children.Add((Item)XamlReader.Load(xmlReader)); 

.

이 접근법은 개념 증명이었습니다. 캔버스에 새 항목을 만들지 않고도 기존 항목의 XAML을 업데이트 할 수 있어야합니다.

항목의 fill 속성에 대한 "전체"업데이트를 수행하는 가장 좋은 방법은 무엇입니까? 로 항목을 캡슐화

item.Fill = Brushes.Blue; 

당신이 무엇을해야하는 경우입니다 :

답변

2

나는 브러시 방금 설정할 수없는 이유를 채우기 속성 인 이상 한 곳에서 사용되고 있다고 가정 UserControl 또는 Brush 유형의 종속성 속성이있는 사용자 지정 컨트롤 브러시 사용에 따라이 채우기를 호출하거나 AccentFill, OuterBorderFill 등과 같이 더 구체적 일 수 있습니다. 그런 다음 XAML에서 브러시의 여러 항목을 모두 해당 속성에 바인딩합니다. 이제 당신이 속성을 설정할 수 있습니다 한 곳이 있고, 바인딩을 그것이이 필요한 모든 곳으로 전파됩니다 할 :

item.AccentFill = Brushes.Blue; 

어떤 경우, 키 것은하지에 대해 생각하는 것입니다 "기존 항목의 XAML을 업데이트하는 중입니다." XAML은 직렬화 형식입니다. 기존 항목은 이미 메모리에있는 .NET 객체이며 직렬화 된 양식에서 다시로드하지 않고 직접 속성을 설정할 수 있습니다.

+0

브러시는 현재 한 곳에서만 사용되지만 현재이 속성에 직접 액세스 할 수 없습니다. 항목 스타일의 현재 설정에 대한 추가 정보를 추가했습니다. – amarcy

+0

바인딩 접근법은 내가 볼 수있는 코드에서 작동해야합니다. Item 클래스에 Fill 의존성 속성을 선언하고 Setter를 itowlson

+0

setter를 위의 값으로 변경하면 다음 오류가 발생합니다. " 'AncestorType {x : Type d : Item}'문자열을 'System.Windows.Data.RelativeSourceMode'유형의 개체로 변환 할 수 없습니다. x : Type d : Item}은 (는) RelativeSourceMode에 유효한 값이 아닙니다. " 어떤 조언이 필요합니까? – amarcy

0

질문을 오해하지 않는 한, 은 정말입니다. 왜이게 효과가 없을까요?

this.Fill = Brushes.Blue; 

또는 리소스 이름을 사용하는 것이 중요합니다 경우 :

this.Fill = (Brush)FindResource("BlueBrush") 

은 어쩌면 당신은 그냥 값을 설정할 수 있고 함께 할 이유를 설명하기 위해 질문을 명확히 할 필요가있다.

+0

XAML을 다루는 것이 어려운 제안이라는 데 동의합니다. 나는 물건의 스타일에 대해 명확한 설명을 덧붙여서 내가 직접 재산과 상호 작용하지 못하게하는 것이라고 생각한다. – amarcy

+0

이름을 지정하고 FindName()을 사용할 수 있지만 상황에 따라 바인딩을 권장합니다. 자세한 내용은 itowlson의 답변을 참조하십시오. –