Pergunta

Eu tenho um item existente que é filho de uma tela.O estilo do item está contido em um dicionário de recursos que contém vários pincéis que podem ser usados ​​para colorir o item.

Quando uma instância do item é criada, ela recebe a coloração padrão.Atualmente não consigo interagir diretamente com a propriedade Fill como em:

item.Fill = BrushBlue;

Por esse motivo, comecei a examinar o XAML de cada instância do item.

O XAML no qual estou interessado para o item após a criação de uma instância é:

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

O ideal seria poder vincular o valor Shape.Fill a uma propriedade da instância do item ou, pelo menos, alterar esse valor com base na seleção do usuário no aplicativo.

Estou editando o XAML do item para alterar sua cor de preenchimento.Para fazer isso, estou usando o seguinte código, baseado no exemplo de clone de botão do 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));

Estou obtendo o XAML, atualizando o nome do recurso do pincel e gerando um novo item.

Essa abordagem foi uma prova de conceito.Quero poder atualizar o XAML do item existente sem precisar criar um novo item na tela.

Qual é a melhor maneira de realizar essa atualização "in-loco" da propriedade de preenchimento do item?

Foi útil?

Solução

Presumo que o pincel esteja sendo usado em mais de um lugar, e é por isso que você não pode simplesmente definir a propriedade Fill:

item.Fill = Brushes.Blue;

Nesse caso o que você deve fazer é encapsular o item em um UserControl ou controle customizado, com uma propriedade de dependência do tipo Brush.(Dependendo do uso do pincel, você também pode chamar isso de Preenchimento, ou pode ser mais específico, por exemplo,AccentFill, OuterBorderFill, etc.) Em seguida, em seu XAML, vincule todas as ocorrências múltiplas do pincel a essa propriedade.Agora você fazer tenha um único local onde você possa definir a propriedade, e através das ligações ela se propagará para todos os locais onde for necessária:

item.AccentFill = Brushes.Blue;

De qualquer forma, o principal é não pensar em "atualizar o XAML do item existente". XAML é um formato de serialização.Seu item existente já é um objeto .NET na memória e você pode definir propriedades diretamente nele, em vez de precisar recarregar de um formulário serializado.

Outras dicas

A menos que eu esteja entendendo mal sua pergunta, você está realmente fazendo isso da maneira mais difícil.Por que isso não funcionaria?

this.Fill = Brushes.Blue;

ou se for importante usar um nome de recurso:

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

Talvez você precise esclarecer sua pergunta para explicar por que você não pode simplesmente definir o valor e pronto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top