Dimensionamento de Databind RenderTransform no Silverlight 2 Beta 2
-
09-06-2019 - |
Pergunta
Alguém sabe se é possível vincular os dados ScaleX e ScaleY de uma transformação de renderização no Silverlight 2 Beta 2?As transformações de vinculação são possíveis no WPF - mas estou recebendo um erro ao configurar minha vinculação no Silverlight por meio de XAML.Talvez seja possível fazer isso através de código?
<Image Height="60" HorizontalAlignment="Right"
Margin="0,122,11,0" VerticalAlignment="Top" Width="60"
Source="Images/Fish128x128.png" Stretch="Fill"
RenderTransformOrigin="0.5,0.5" x:Name="fishImage">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Image.RenderTransform>
</Image>
Quero vincular ScaleX e ScaleY do elemento ScaleTransform.
Estou recebendo um erro de tempo de execução quando tento vincular uma propriedade dupla em meu contexto de dados:
Message="AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 1570 Position: 108]"
Minha ligação fica assim:
<ScaleTransform ScaleX="{Binding Path=SelectedDive.Visibility}"
ScaleY="{Binding Path=SelectedDive.Visibility}"/>
Verifiquei três vezes se o caminho de ligação está correto - estou vinculando uma barra deslizante ao mesmo valor e isso funciona perfeitamente ...
A visibilidade é do tipo double e é um número entre 0,0 e 30,0.Eu tenho um conversor de valor que reduz esse número para 0,5 e 1 - quero dimensionar o tamanho do peixe dependendo da clareza da água.Então não acho que seja um problema com o tipo ao qual estou vinculando ...
Solução
ScaleTransform não tem um contexto de dados, então provavelmente a ligação está procurando por SelectedDive.Visibility por si só e não o encontrando.Há muito no xaml e na ligação de dados do Silverlight que é diferente do WPF ...
De qualquer forma, para resolver isso, você desejará configurar a ligação no código ** ou ouvir manualmente o evento PropertyChanged do seu objeto de dados e definir a escala no código por trás.
Eu escolheria o último se você quisesse fazer uma animação/storyboard para a mudança de escala.
** preciso verificar, mas talvez você não consiga vincular a ele.pelo que me lembro, se o RenderTransform não faz parte de uma animação, ele é transformado em uma transformação de matriz e todas as apostas são canceladas.
Outras dicas
É um erro de execução ou de compilação, Jonas?Olhando para o documentação, ScaleX e ScaleY são propriedades de dependência, então você deve ser capaz de escrever
<ScaleTransform ScaleX="{Binding Foo}" ScaleY="{Binding Bar}" />
...onde Foo e Bar são do tipo apropriado.
Editar:Claro, essa é a documentação do WPF.Suponho que seja possível que eles tenham alterado ScaleX e ScaleY para serem propriedades padrão em vez de propriedades de dependência no Silverlight.Eu adoraria ouvir mais sobre o erro que você está vendo.
Ah, acho que vejo seu problema.Você está tentando vincular uma propriedade do tipo Visibility (SelectedDive.Visibility) a uma propriedade do tipo Double (ScaleTransform.ScaleX).O WPF/Silverlight não pode converter entre esses dois tipos.
O que você está tentando realizar?Talvez eu possa ajudá-lo com o XAML.O que é "SelectedDive" e o que você deseja que aconteça quando sua visibilidade mudar?
Desculpe - estava esperando que a contagem de respostas aumentasse, então não percebi que você havia editado a pergunta com mais informações.
OK, então Visibility é do tipo Double, então a ligação deve funcionar nesse sentido.
Como solução alternativa, você poderia tentar vincular seus valores ScaleX e ScaleY diretamente ao controle deslizante ao qual SelectedDive.Visibility está vinculado?Algo como:
<ScaleTransform ScaleX="{Binding ElementName=slider1,Path=Value}" ... />
Se isso funcionar, pelo menos você vai começar.
Editar:Ah, acabei de lembrar que li uma vez que o Silverlight não suporta a sintaxe ElementName em ligações, então isso pode não funcionar.
Sim, talvez as transformações de renderização incorporadas não estejam herdando o DataContext do objeto ao qual se aplicam.Você pode forçar o DataContext neles?Por exemplo, dê um nome à transformação:
<ScaleTransform x:Name="myScaler" ... />
...e depois no seu code-behind:
myScaler.DataContext = fishImage.DataContext;
...para que o escalonador compartilhe definitivamente seu DataContext com a imagem.
Ok, a própria Image está captando o DataContext corretamente?
Tente adicionar isto:
<Image Tooltip="{Binding SelectedDive.Visibility}" ... />
Se isso for compilado e executado, passe o mouse sobre a imagem e veja se ela exibe o valor correto.
Eu esperava resolver isso por meio de XAML, mas descobri que a sugestão de Brian era o caminho a percorrer.Usei a sugestão de Matt para dar um nome à transformação da escala, para que eu possa acessá-la a partir do código.Em seguida, conectei o evento de alteração de valor do controle deslizante e atualizei manualmente as propriedades ScaleX e ScaleY.Mantive meu conversor de valores para converter da faixa de visibilidade (0-30m) para a escala (0,5 a 1).O código fica assim:
private ScaleConverter converter;
public DiveLog()
{
InitializeComponent();
converter = new ScaleConverter();
visibilitySlider.ValueChanged += new
RoutedPropertyChangedEventHandler<double>(visibilitySlider_ValueChanged);
}
private void visibilitySlider_ValueChanged(object sender,
RoutedPropertyChangedEventArgs<double> e)
{
fishScale.ScaleX = (double)converter.Convert(e.NewValue,
typeof(double), null, CultureInfo.CurrentCulture);
fishScale.ScaleY = fishScale.ScaleX;
}