繁体   English   中英

从MainPage访问UserControl中ItemsSource内的Canvas

[英]Access a Canvas inside an ItemsSource in a UserControl, from the MainPage

我有一个FlipView在我MainPage 这是ItemTemplate绑定到名为landscapeControlUserControl 它的ItemsSource绑定到名为MyLandscape的类的List。

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

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

我的图像完美呈现。 我只想要三件事:

1)我想从我的MainPage访问我的Canvas 我试图在flipView_SelectionChanged事件中执行此flipView_SelectionChanged

        landscapeControl pc = flipView1.SelectedItem as landscapeControl;

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

但是pc变量总是为空! 我想绑定我的Canvas ,所以每两个图像都有一个Canvas 那可能吗?

一种方法是使用CommandUIElement传递回模型。

基本上你的inkCanvas元素将附加一个像这样的CanvasLoadedCommand 请注意,只有在完全加载inkCanvas时才会调用此命令。

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

我在这里为这个小演示 (工作源代码)创建了一个简单的DelegateCommand 加载inkCanvas

this.inkCanvas =(画布)画布;

将被调用,然后将填充inkCanvas属性。

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

            return _canvasLoadedCommand;
        }
    }

希望这可以帮助!

更改您的代码:

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

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

好了,经过长时间的搜寻,在以后Windows Store Apps :我们不能访问一个Canvas ,这是一个内部FlipView ,或者如果它是直接在里面FlipViewDataTemplate的的FlipView

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM