Erro Silverlight “Layout Ciclo detectado Disposição não pôde ser concluída” ao usar o controle personalizado

StackOverflow https://stackoverflow.com/questions/636245

Pergunta

Eu estou construindo um controle personalizado no Silverlight derivando ContentControl e fazer algumas especial formatação de colocar um dropshadow por trás dos conteúdos.

Eu quase tenho que trabalhar, mas recentemente correu para um erro bizarro. Ele funciona muito bem se ele contém nada além de uma fronteira, ou uma Planilha / StackPanel / etc que não tem uma altura e largura explicitamente definido.

Recebo um erro de JavaScript no IE, eo texto diz:

Erro de tempo de 4008 ... Disposição Ciclo detectado ... Disposição não pôde ser concluída.

Se eu especificar uma altura e largura no grid contido / StackPanel / etc funciona bem.

Há uma tonelada na web sobre este erro quando muitas caixas de texto são usados ??(mais de 250), mas eu sou capaz de reproduzir o meu erro com um único botão em uma grade.

Eu não tenho caixas de texto em tudo na página. O erro tem a ver com um loop infinito detectado. I definir alguns pontos de interrupção no código e parece que o evento "SizeChanged" está sendo chamado de um monte durante a renderização, e cada vez que a altura / largura incrementos de 10.

Estou assumindo que a fixação de uma altura padrão / largura faz com que ele pule este incremento do número, mas não tenho idéia por que este erro está acontecendo.

Alguém correu para isso ou tem alguma idéia?

Foi útil?

Solução

Há um bom post sobre esse erro aqui .

Bascially o que pode acontecer é que você está mudando um pouco o tamanho em um algum lugar MeasureOverride que faz com que uma outra medida, que altera o tamanho, o que provoca uma medida e assim por diante. Corri para este uma vez antes e fixa-lo, removendo qualquer código que causou uma atualização de layout ou desencadeada uma atualização do layout durante o ciclo de layout.

Atualização: Uma vez que o post está desaparecido, citando-lo aqui na íntegra:

Continuando minha série de armadilhas para o Silverlight 2, eu queria falar sobre um erro comum que as pessoas estão vendo. Este erro é algo novo que você pode ver quando mover o código do Beta 2 para a versão Release Candidate ou mais tarde. Em Beta 2, se o mecanismo de layout detectado um ciclo, ele não lançar quaisquer erros; como eu o entendo, o layout foi apenas abortada. Mas com pedaços pós Beta2, um erro é lançado.

O erro que você vai ter irá especificar "Layout Ciclo detectado" como a mensagem. Esta mensagem de erro é muito preciso - o mecanismo de layout detectado um ciclo dentro de seu layout; ou outra forma de dizê-lo, você tem um loop infinito em seu layout.

O maior culpado que leva a este erro é o código dentro do manipulador de eventos LayoutUpdated. Se o manipulador de eventos LayoutUpdated faz nada para alterar o layout de seu controle, em seguida, que fará com que o evento LayoutUpdated ao fogo novamente, e novamente, e novamente ...: -)

Às vezes, você precisa ter o código de alteração de layout dentro desse manipulador de eventos, porém, assim que se deve fazer?

Em primeiro lugar, você deve considerar se você realmente precisa as alterações de layout para ocorrer em cada chamada para LayoutUpdated. Seria suficiente para manipular o evento Loaded, bem como o evento Application.Current.Host.Content.Resized. Entre esses dois eventos, você vai ser notificado quando o controle é carregado para a árvore visual, e você vai ser notificado a qualquer momento o anfitrião é redimensionada, o que poderia fazer com que você precisa mudar seu layout novamente. Cenários como diálogos modais devem se enquadram nesta categoria.

Em segundo lugar, se você realmente precisa usar LayoutUpdated, você pode só precisa colocar algumas condições ao redor suas mudanças de layout. Por exemplo, se você está calculando uma nova largura e altura para o seu controle, antes que você realmente definir a largura e altura, verifique se os valores atuais diferem do que calculado. Isso permitirá que o primeiro evento LayoutUpdated para redimensionar o seu controle, o que desencadeia um outro evento LayoutUpdated, mas esse evento vai reconhecer que não há trabalho a fazer, eo ciclo vai acabar.

Essas mesmas regras se aplicam quando você está manipulando o evento SizeChanged, ou se você estiver fazendo qualquer outra substituições no layout de seu controle.

Outras dicas

Uma causa comum está a lidar com SizeChanged e, em seguida, no manipulador fazendo algo que afeta o tamanho do elemento. Às vezes isso não é óbvio -. Que poderia ser modificando elementos filhos que afetam o tamanho de seu recipiente, por exemplo,

1. Se você estiver usando LongListSelector dentro ScrollViewer, remova melhor isso. Eu estava enfrentando o mesmo problema e meu LongListSelector estava dentro de ScrollViewer. Durante o evento ItemRealized, foi recebendo este erro.

2. Não uso UpdateLayout () dentro itemrealized..I estava usando algo como

 list.UpdateLayout();
 list.ScrollTo(e.Container.Content);

Basta usar ScrollTo

3. Se você estiver usando uma imagem dentro longlistselector, certifique-se de definir a altura e largura da imagem.

Eu tive o mesmo problema e o que eu fiz foi colocar todas as atualizações de layout (mudanças de tamanho) em uma "invocação" delegar en invocado mais tarde, ele pára de bater, mas você há uma mudança boa que está preso em um loop

Eu tive o mesmo problema, mas isso só ocorreu muito raramente, o meu código não mudou durante anos e só recentemente alguém conseguiu experimentá-lo.

Eu tinha um TextBlock dentro de um LongListSelector DataSource e sua TamanhoDoTipoDeLetra foi definido para 21. Alterar o FontSize para qualquer outro valor fixo o problema para mim ...

As minhas LongListSelectors está dentro de um ScrollViewer.

            <phone:PanoramaItem x:Name="OwnedGamesPanoramaItem" >
            <ScrollViewer Margin="5,-25,0,0">
            <StackPanel>
                    <TextBlock toolkit:TiltEffect.IsTiltEnabled="True" Text="{Binding Path=LocalizedResources.XOwnedGames, Source={StaticResource LocalizedStrings}}" FontFamily="Segoe WP Semibold" CharacterSpacing="10"  FontSize="25" Margin="0,10,0,25" TextWrapping="Wrap"/>
                    <TextBlock x:Name="ownedGameLoadingTextBox" Margin="10" FontSize="26" Text="{Binding Path=LocalizedResources.XLoading, Source={StaticResource LocalizedStrings}}" HorizontalAlignment="Center"/>
                    <phone:LongListSelector x:Name="OwnedGameListBox" Tap="OwnedGameListBoxTap" ScrollViewer.VerticalScrollBarVisibility="Disabled" ItemRealized="OwnedGameListBox_ItemRealized" ItemUnrealized="OwnedGameListBox_ItemUnrealized" BorderThickness="0,20,0,0"  >
                        <phone:LongListSelector.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Vertical" Tap="OwnedGameListBoxTap" Margin="0,0,0,12">
                                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10,0,0" Tap="StackPanel_Tap_1">
                                        <Image Width="60" Source="{Binding getSmallImageActualURL}" Height="60"  Margin="3" VerticalAlignment="Top" />
                                        <StackPanel Margin="15,0,0,0">
                                            <TextBlock Width="320" TextWrapping="Wrap" Text="{Binding name}" Margin="0,0,0,0" FontSize="32" />
                                            <TextBlock Text="{Binding getTotalPlaytimeFormatted}" Margin="0,0,0,0" TextWrapping="Wrap" FontSize="21" >
                                                <TextBlock.Foreground>
                                                    <SolidColorBrush Color="{StaticResource PhoneAccentColor}"/>
                                                </TextBlock.Foreground>
                                            </TextBlock>
                                        </StackPanel>
                                    </StackPanel>
                                </StackPanel>
                            </DataTemplate>
                        </phone:LongListSelector.ItemTemplate>
                    </phone:LongListSelector>
                </StackPanel>
            </ScrollViewer>
        </phone:PanoramaItem>

Fix:

<TextBlock Text="{Binding getTotalPlaytimeFormatted}" Margin="0,0,0,0" TextWrapping="Wrap" FontSize="22" >
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top