1

だから私はWindows Phoneアプリに取り組んでおり、2つのスタックパネル(基本的にアプリの2つのメイン画面)間で要素を移動しようとしています.

次のようなピボット アイテムがあります。

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

AllTokenStack のアイテムがダブルタップされたら、それを myTokenStack に移動したいと考えています。これを行うと、プログラムがクラッシュし、「パラメーターが正しくありません」と表示されます。これは、デバッグ モードでない場合にのみ行われます (電話がコンピューターから取り外され、アプリを実行しようとした場合)。デバッグモードであれば正常に動作します。

オブジェクトを転送するために使用しているコードは次のとおりです。

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

この奇妙なバグを解決する方法を知っている人はいますか?

編集 明確にするためだけに。C# コードは、私が Token と呼んだクラス内にあります。Token クラスはユーザー コントロールです。ユーザーがタップしてイベントをトリガーするコントロールです。これは間違った方法ですか?

例外からのスタックトレース:

   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)
4

1 に答える 1

2

UserControls を使用するObservableCollectionのではなく、バックエンドにトークン クラスを使用して、データバインディングを使用しようとします。GUI部分がバインディングによって処理されると、物事の移動が少し簡単になります。

これを行う方法の例として、「Windows Phone Pivot Application」テンプレートをベースとして使用する Windows Phone プロジェクトを作成し、「TokenAnswer」という名前を付けました (これを実行して以下のコードに貼り付ける場合は、実際の例があります)。

MainPage.xaml に、最初のリストのアイテム テンプレートに DoubleTap イベントを追加し、SecondListBox バインディングを "Items2" に設定しました。また、Tag={Binding} を設定して、Tag 変数を GUI アイテムの背後にある ItemViewModel に設定します (これは、タップされたアイテムにアクセスできるようにするためです。これを行う方法は他にもありますが、この例ではこれで十分簡単です)。 )。

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

MainViewModel.cs で、2 番目のコレクション ("Items2") を追加し、コンストラクターで初期化しました。このコレクションは 2 番目のリストボックス用です。

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; }

最後に、MainPage.xaml.cs に、イベント ハンドラーの分離コードを追加して、最初のコレクションから項目を削除し、2 番目のコレクションに追加しました。

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);
    }

これをガイドとして使用して、現在のプロジェクトを支援できることを願っています!

于 2012-05-22T21:10:43.747 に答える