문제

나는 캔버스의 자녀 인 기존 품목이 있습니다. 항목의 스타일은 아이템을 색칠하는 데 사용할 수있는 다양한 브러시가 포함 된 리소스 사전에 포함되어 있습니다.

항목의 인스턴스가 생성되면 기본 색상이 제공됩니다. 현재 채우기 속성과 직접 상호 작용할 수 없습니다.

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의 버튼 클론 샘플을 기반으로 다음 코드를 사용하고 있습니다.

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을 얻고 브러시 리소스 이름을 업데이트 한 다음 새 항목을 생성합니다.

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

항목의 채우기 속성에 대한 "현장"업데이트를 달성하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

브러시가 둘 이상의 장소에서 사용되고 있다고 가정하므로 채우기 속성을 설정할 수는 없습니다.

item.Fill = Brushes.Blue;

이 경우 유형 브러시의 종속성 속성을 사용하여 항목을 Usercontrol 또는 사용자 정의 컨트롤로 캡슐화하는 것입니다. (브러시 사용에 따라, 당신은 이것을 채우기라고 부르거나 더 구체적 일 수도 있고, 예를 들어, AccentFill, OuterborderFill 등을 더 구체적 일 수도 있습니다.) XAML에서 브러시의 여러 가지 발생을 해당 속성에 바인딩하십시오. 이제 당신 하다 속성을 설정할 수있는 단일 장소가 있으면 바인딩을 통해 필요한 모든 장소로 전파됩니다.

item.AccentFill = Brushes.Blue;

어쨌든 핵심은 "기존 항목의 XAML 업데이트"에 대해 생각하지 않는 것입니다. XAML은 직렬화 형식입니다. 기존 항목은 이미 메모리의 .NET 객체이며 직렬화 된 양식에서 다시로드 할 필요가없는 대신 직접 속성을 설정할 수 있습니다.

다른 팁

내가 당신의 질문을 오해하지 않는 한, 당신은입니다 진짜 어려운 방법으로. 왜 이것이 효과가 없습니까?

this.Fill = Brushes.Blue;

또는 리소스 이름을 사용하는 것이 중요하다면 :

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

아마도 당신은 왜 당신이 그 가치를 설정하고 그로 인해 끝날 수 없는지 설명하기 위해 질문을 명확히해야 할 것입니다.

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