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

Foi útil?

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;
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top