2015-05-09 6 views
5

Ich habe eine FlipView in meinem MainPage. Es ist ItemTemplate gebunden an eine UserControl namens landscapeControl. Es ist ItemsSource ist an eine Liste einer Klasse namens MyLandscape gebunden.Zugriff auf einen Canvas in einer ItemsSource in einem UserControl, von der MainPage

landscapeControl:

<Grid> 
    <ScrollViewer x:Name="LScrollViewer" MaxZoomFactor="2.0" MinZoomFactor="1.0" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" DoubleTapped="LScrollViewer_DoubleTapped" > 
     <Canvas x:Name="inkCanvas" Background="Transparent"> 
      <StackPanel x:Name="LStackPanel" Orientation="Horizontal" Margin="0,0,0,0"> 
       <Image x:Name="LImage0" HorizontalAlignment="Right" Source="{Binding firstImage}" Width="570"/> 
       <Image x:Name="LImage1" HorizontalAlignment="Left" Source="{Binding nextImage}" Width="570"/> 
      </StackPanel> 
     </Canvas> 
    </ScrollViewer> 
</Grid> 

MyLandscape Klasse:

public class MyLandscape 
    { 
     public ImageSource firstImage { get; set; } 
     public ImageSource nextImage { get; set; } 
     public Canvas inkCanvas { get; set; } 
    } 

Meine Bilder perfekt zeigen. Alles, was ich will, ist 3 Dinge:

1) Ich möchte auf meine Canvas von meinem MainPage zugreifen. Ich versuche, dies in flipView_SelectionChanged Ereignis zu tun:

 landscapeControl pc = flipView1.SelectedItem as landscapeControl; 

     if (flipView1.Items.Count > 0) 
     { 
      var myCanvas = pc.getCanvas(); 
      m_CanvasManager = new CanvasManager(myCanvas); 
     } 

aber der PC Variable ist immer null! Ich möchte meine Canvas binden, also habe ich eine Canvas für jeweils zwei Bilder? Ist das möglich?

+0

in Ihrem flipView_SelectionChanged-Ereignis, können Sie e.AddedItems aufrufen? Wenn ja, ändern Sie den Code: if (flipView1.Items.Count> 0) { var myCanvas = pc.getCanvas(); m_CanvasManager = neuer CanvasManager (myCanvas); } bis if (e.AddedItems.Anzahl> 0) { var myCanvas = (e.AddedItems als LandscapeControl) .getCanvas(); m_CanvasManager = neuer CanvasManager (myCanvas); } –

Antwort

1

Eine Möglichkeit besteht darin, eine Command zu verwenden, um eine UIElement zurück an Ihr Modell zu übergeben.

Grundsätzlich wird Ihr inkCanvas Element mit einem CanvasLoadedCommand wie folgt verbunden werden. Beachten Sie, dass dieser Befehl nur aufgerufen wird, wenn der inkCanvas vollständig geladen ist.

<Canvas x:Name="inkCanvas" Background="Transparent"> 
     <Interactivity:Interaction.Behaviors> 
      <Core:EventTriggerBehavior> 
       <Core:InvokeCommandAction Command="{Binding CanvasLoadedCommand}" CommandParameter="{Binding ElementName=inkCanvas}" /> 
      </Core:EventTriggerBehavior> 
     </Interactivity:Interaction.Behaviors> 

Ich habe eine einfache DelegateCommand für diese kleine demo (Arbeits Quellcode) hier erstellt. Wenn die inkCanvas geladen wird,

this.inkCanvas = (Leinwand) Leinwand;

wird aufgerufen und die inkCanvas Eigenschaft wird dann gefüllt werden.

private DelegateCommand _canvasLoadedCommand; 
    public DelegateCommand CanvasLoadedCommand 
    { 
     get 
     { 
      if (_canvasLoadedCommand == null) 
      { 
       _canvasLoadedCommand = new DelegateCommand((canvas) => 
       { 
        this.inkCanvas = (Canvas)canvas; 
       }, 
       (canvas) => canvas != null); 
      } 

      return _canvasLoadedCommand; 
     } 
    } 

Hoffe, das hilft!

+0

'xmlns: Interactivity =" mit: Microsoft.Xaml.Interactivity " xmlns: Core =" mit: Microsoft.Xaml.Interactions.Core "' kann nicht erkannt werden, wenn zu meinem UserControl hinzugefügt. Wie kann ich Interaktivität definieren? oder ist es eine Referenz, die ich herunterladen sollte? – yalematta

+0

Add Reference, dann wählen Sie Verhalten SDK auf der Registerkarte Erweiterungen. –

+0

Implementiert! Und die zurückgegebenen inkCanvas ist immer null :( – yalematta

0

aus dem Code ändern:

if (flipView1.Items.Count > 0) { 
    var myCanvas = pc.getCanvas(); 
    m_CanvasManager = new CanvasManager(myCanvas); 
} 

zu

if (e.AddedItems.Count > 0) { 
    var myCanvas = (e.AddedItems[0] as LandscapeControl).getCanvas(); 
    m_CanvasManager = new CanvasManager(myCanvas); 
} 
+0

Ich hatte eine ** NullReferenceException ** bei 'var myCanvas = (e.AddedItems [0] als LandscapeControl) .getCanvas();' – yalematta

+0

Layale, haben Sie LandscapeControl Benutzersteuerung und MyLandscape-Klasse, was ist die Beziehung zwischen LandscapeControl und MyLandscape? –

+0

sollten Sie nicht die Dateien lantryControl.xaml und landscapeControl.xaml.cs haben? –

0

Nun, nach langer Suche in Windows Store Apps: Wir kann nicht Zugang ein Canvas, die in einem FlipView ist, wenn entweder Es befindet sich direkt in der FlipView oder in der DataTemplate der FlipView.

+0

Nicht wahr. Das 'SelectedItem' ist ein Typ von' MyLandscape', nicht 'landscapeControl'. Wenn Sie die 'inkCanvas' richtig formatieren, sollten Sie in der Lage sein, die' Canvas' Instanz von '((MyLandscape) flipView1.SelectedItem) .inkCanvas' zu beziehen. –

+0

Die eigentliche Frage ist, wie kann man die InkCanvas richtig beschreiben? – yalematta

+0

Haben Sie Command & CommandParameter in Ihrem Projekt implementiert? –

Verwandte Themen