2009-03-11 14 views
13

Estoy creando un control personalizado en Silverlight derivando de ContentControl y haciendo un formato especial para poner una sombra de gotas detrás de los contenidos.Error de Silverlight "El diseño detectado de ciclo de diseño no se pudo completar" al usar el control personalizado

Casi lo tengo funcionando, pero recientemente me encontré con un error extraño. Funciona bien si contiene algo además de un borde, o un Grid/Stackpanel/etc que no tiene una altura y un ancho explícitamente definidos.

me sale un error de JavaScript en IE, y el texto dice:

Tiempo de ejecución Error 4008 ... Ciclo Disposición Detectado ... Disposición No se pudo completar.

Si especifico una altura y un ancho en la cuadrícula contenida/stackpanel/etc, funciona bien.

Hay un montón en la web sobre este error cuando se usan demasiados cuadros de texto (más de 250), pero puedo reproducir mi error con un solo botón en una cuadrícula.

No tengo ningún cuadro de texto en la página. El error tiene que ver con un bucle infinito detectado. Establecí algunos puntos de interrupción en el código y parece que el evento "SizeChanged" se está llamando mucho durante el procesamiento, y cada vez el alto/ancho aumenta en 10.

Supongo que establecer una altura predeterminada/El ancho hace que se salte este incremento del número, pero no tengo idea de por qué ocurre este error.

¿Alguien se ha encontrado con esto o tiene alguna idea?

+0

me he encontrado con este problema con el control de la Telerik RadWindow (sería probablemente también ocurrirá con el ChildWindow regular). El problema ocurrió cuando especifiqué MinHeight y MinWidth sin especificar ancho y alto. Cuando el tamaño del contenido de la ventana cambió, se produjo un ciclo de diseño. Establecer Ancho y Alto a los mismos valores que MinWidth y MinHeight resolvió el problema. –

Respuesta

7

Hay un good blog post on this error here.

Básicamente lo que puede pasar es que está cambiando el tamaño en un MeasureOverride en algún lugar que causa otra medida, que cambia el tamaño, lo que causa una medida y así sucesivamente. Me encontré con esto una vez y lo arreglé quitando cualquier código que causó una actualización de diseño o activó una actualización de diseño durante el ciclo de diseño.

Actualización: Desde el blog se ha ido, citando aquí en su totalidad:

Continuando con mi serie de trampas para Silverlight 2, quería hablar de un error común que la gente está viendo. Este error es algo nuevo que puede ver al mover el código de Beta 2 a Release Candidate o posterior. En Beta 2, si el motor de diseño detectó un ciclo, no arrojó ningún error; como yo lo entiendo, el diseño fue abortado. Pero con los bits Beta2 posteriores, se produce un error.

El error que obtendrá especificará "Ciclo de diseño detectado" como el mensaje. Este mensaje de error es muy preciso: el motor de diseño detectó un ciclo dentro de su diseño; u otra forma de decirlo, tienes un bucle infinito en tu diseño.

El principal culpable que lleva a este error es el código dentro del controlador de eventos LayoutUpdated. Si su manejador de eventos LayoutUpdated hace algo para alterar el diseño de su control, eso ocasionará que el evento LayoutUpdated se active nuevamente, y nuevamente, y nuevamente ... :-)

A veces necesita tener un código de alteración del diseño dentro Sin embargo, este controlador de eventos, ¿qué hay que hacer?

En primer lugar, debe considerar si realmente necesita que los cambios de diseño ocurran en cada llamada a LayoutUpdated. Sería suficiente para manejar el evento Loaded así como el evento Application.Current.Host.Content.Resized. Entre estos dos eventos, recibirás una notificación cuando el control se cargue en el árbol visual, y recibirás una notificación cada vez que cambies el tamaño del host, lo que podría ocasionar que necesites cambiar tu diseño nuevamente. Escenarios como los cuadros de diálogo modales deberían incluirse en esta categoría.

En segundo lugar, si realmente necesita utilizar LayoutUpdated, es posible que deba poner algunas condiciones en torno a los cambios de diseño. Por ejemplo, si está calculando un nuevo ancho y alto para su control, antes de establecer realmente el ancho y el alto, verifique que los valores actuales difieran de los que calculó. Esto permitirá que el primer evento LayoutUpdated cambie el tamaño de su control, lo que desencadenará otro evento LayoutUpdated, pero ese evento reconocerá que no hay trabajo que hacer, y el ciclo finalizará.

Estas mismas reglas se aplicarán cuando maneje el evento SizeChanged, o si está haciendo otras modificaciones en el diseño de su control.

+0

Este es el problema que estoy viendo. La publicación del blog enlazado sugiere solo hacer su diseño en la carga inicial y cuando la aplicación Silverlight (el control de usuario que lo contiene) cambia su tamaño.Esto podría funcionar para mí, pero aún no lo he probado al hacer animaciones y otras acciones. ¡Gracias por la ayuda! –

+0

@bryant blog dead; ( – MemeDeveloper

+0

Wayback machine to the rescue: https://web.archive.org/web/20110203182929/http://jeffhandley.com/archive/2008/09/26/silverlight-2-post- beta2-gotcha --- layout-cycle-detected.aspx – Bryant

6

Una causa común es la manipulación de SizeChanged y luego en el controlador de hacer algo que afecta el tamaño del elemento. A veces esto no es obvio: podría modificar los elementos secundarios que afectan el tamaño de su contenedor, por ejemplo.

1

que tenían el mismo problema y lo que hice fue poner todos los cambios de diseño (cambios de tamaño) de un delegado "invocar" es invocado después, se deja de chocar, pero que no es un buen cambio es atrapado en un bucle

4

1.Si está usando LongListSelector dentro de ScrollViewer, mejor elimine eso. Estaba enfrentando el mismo problema y mi LongListSelector estaba dentro de ScrollViewer. Durante el evento ItemRealized, recibía este error.

2. No utilice UpdateLayout() dentro itemrealized..I estaba usando algo así como

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

Sólo tiene que utilizar ScrollTo

3. Si está utilizando una imagen dentro longlistselector, asegúrese de establecer la altura y el ancho de la imagen.

0

Tuve el mismo problema pero solo ocurría muy raramente, mi código no ha cambiado durante años y solo recientemente alguien logró experimentarlo.

que tenían un TextBlock dentro de un origen de datos y su LongListSelector TamañoDeFuente se ajustó a 21. Cambiar el Tamaño de Letra a cualquier otro valor fijo el problema para mí ...

Mis LongListSelectors está dentro de un 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" > 
Cuestiones relacionadas