El parámetro es un error incorrecto con stackpanel

Entonces, estoy trabajando en una aplicación de teléfono de Windows y estoy tratando de mover elementos entre dos paneles de pila (que son básicamente las dos pantallas principales de mi aplicación).

Tengo un elemento pivote que se ve así:

<controls:Pivot Title="MY APPLICATION">
<!--Pivot item one-->
    <controls:PivotItem Header="All Tokens">
        <ListBox x:Name="AllTokenListBox" Margin="0,0,0,0">
            <StackPanel x:Name="AllTokenStack"></StackPanel>
        </ListBox>
    </controls:PivotItem>
    <!--Pivot item two-->
    <controls:PivotItem Header="My Tokens">
        <ListBox x:Name="MyTokenListBox" Margin="0,0,0,0">
            <StackPanel x:Name="myTokenStack"></StackPanel>
        </ListBox>
    </controls:PivotItem>
</controls:Pivot>

Cuando se toca dos veces un elemento en AllTokenStack, quiero moverlo a myTokenStack. Cuando hago eso, el programa falla y dice "El parámetro es incorrecto". Solo hace esto si NO estoy en modo de depuración (es decir, si el teléfono está desconectado de la computadora e intento ejecutar la aplicación). Si está en modo de depuración, funciona bien.

Aquí está el código que estoy usando para transferir el objeto:

private void container_Tap(object sender, GestureEventArgs e) {
    if (AllTokenContainer.Children.Contains(this)) {
       AllTokenContainer.Children.Remove(this);
       MyTokenContainer.Children.Add(this);      
    }
}

¿Alguien sabe cómo resolver este extraño error?

EDITAR Sólo para que quede claro. El código C# está dentro de una clase a la que llamé Token. La clase Token es un control de usuario. Es ese control que el usuario toca para activar el evento. ¿Es esta la forma incorrecta de hacerlo?

Stacktrace de la excepción:

   at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
   at MS.Internal.XcpImports.Collection_AddValue[T](PresentationFrameworkCollection`1 collection, CValue value)
   at MS.Internal.XcpImports.Collection_AddDependencyObject[T](PresentationFrameworkCollection`1 collection, DependencyObject value)
   at System.Windows.PresentationFrameworkCollection`1.AddDependencyObject(DependencyObject value)
   at System.Windows.Controls.UIElementCollection.AddInternal(UIElement value)
   at System.Windows.PresentationFrameworkCollection`1.Add(UIElement value)
   at MTG_Token_Tracker.TokenGraphic.container_Tap(Object sender, GestureEventArgs e)
   at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)

preguntado el 22 de mayo de 12 a las 19:05

¿Qué es 'esto' en este contexto, no querrías mover el remitente? -

Si tiene errores... publique la excepción, no el mensaje... -

Para publicar los detalles de la excepción, envuelva su cuerpo container_Tap en un intento/captura (Excepción e) y muestre la excepción (e) de alguna manera (tal vez MessageBox.Show)... -

Cuando agrego las instrucciones try catch y las imprimo, todo lo que dice es "El parámetro es incorrecto". Esto se refiere a la instancia de clase que se tocó. La clase es un control de usuario -

¿Qué son los Contenedores? Estoy confundido sobre cómo van los datos desde su control de usuario (no mostrado) a su página Pivot:

1 Respuestas

En lugar de usar UserControls, intentaría usar el enlace de datos, con ObservableCollectionde clases de tokens en el back-end. Mover las cosas se vuelve un poco más fácil cuando el enlace se ocupa de la parte de la GUI.

Para ver un ejemplo de cómo hacer esto, creé un proyecto de Windows Phone usando la plantilla "Aplicación dinámica de Windows Phone" para usar como base y lo llamé "TokenAnswer" (si hace esto y pega el código a continuación, debe tener un ejemplo de trabajo).

A MainPage.xaml, agregué el evento DoubleTap a la plantilla de elemento de la primera lista y configuré el enlace SecondListBox en "Items2". También establecí Tag={Binding}, que establece la variable Tag en ItemViewModel detrás del elemento GUI (esto se hace para poder acceder al elemento tocado, hay otras formas de hacerlo, pero esta es bastante fácil para este ejemplo) ).

<phone:PhoneApplicationPage 
x:Class="TokenAnswer.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait"  Orientation="Portrait"
shell:SystemTray.IsVisible="True">

<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
    <!--Pivot Control-->
    <controls:Pivot Title="MY APPLICATION">
        <!--Pivot item one-->
        <controls:PivotItem Header="first">
            <!--Double line list with text wrapping-->
            <ListBox x:Name="FirstListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                      <StackPanel DoubleTap="Token_DoubleTap" Tag="{Binding}" Margin="0,0,0,17" Width="432" Height="78">
                          <TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                          <TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                      </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </controls:PivotItem>

        <!--Pivot item two-->
        <controls:PivotItem Header="second"> 
            <!--Triple line list no text wrapping-->
                <ListBox x:Name="SecondListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items2}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Margin="0,0,0,17">
                                <TextBlock Text="{Binding LineOne}" TextWrapping="NoWrap" Margin="12,0,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                                <TextBlock Text="{Binding LineThree}" TextWrapping="NoWrap" Margin="12,-6,0,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
        </controls:PivotItem>
    </controls:Pivot>
</Grid>

</phone:PhoneApplicationPage>

En MainViewModel.cs, agregué una segunda colección ("Items2") y la inicialicé en el constructor, esta colección es para el segundo cuadro de lista:

public MainViewModel()
    {
        this.Items = new ObservableCollection<ItemViewModel>();
        this.Items2 = new ObservableCollection<ItemViewModel>();
    }

    /// <summary>
    /// A collection for ItemViewModel objects.
    /// </summary>
    public ObservableCollection<ItemViewModel> Items { get; private set; }
    public ObservableCollection<ItemViewModel> Items2 { get; private set; }

Finalmente, en MainPage.xaml.cs, agregué el código subyacente para el controlador de eventos, para eliminar el elemento de la primera colección y agregarlo a la segunda.

private void Token_DoubleTap(object sender, GestureEventArgs e)
    {
        var token = (sender as StackPanel).Tag as ItemViewModel;
        App.ViewModel.Items.Remove(token);
        App.ViewModel.Items2.Add(token);
    }

¡Espero que pueda usar esto como una guía para ayudar a su proyecto actual!

contestado el 22 de mayo de 12 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.