c# - 从 MainPage 访问 UserControl 中 ItemsSource 内的 Canvas

标签 c# canvas windows-store-apps windows-8.1

我的 MainPage 中有一个 FlipView。它是 ItemTemplate 绑定(bind)到名为 landscapeControlUserControl。它的 ItemsSource 绑定(bind)到名为 MyLandscape 的类的列表。

景观控制:

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

我的图像显示完美。我只想要 3 样东西:

1) 我想从我的 MainPage 访问我的 Canvas。我正在尝试在 flipView_SelectionChanged 事件中执行此操作:

        landscapeControl pc = flipView1.SelectedItem as landscapeControl;

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

但是 pc 变量总是空的!我想绑定(bind)我的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>

我为这个小 demo 创建了一个简单的 DelegateCommand (工作源代码)在这里。当加载 inkCanvas 时,

this.inkCanvas = (Canvas)canvas;

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

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

            return _canvasLoadedCommand;
        }
    }

希望这对您有所帮助!

关于c# - 从 MainPage 访问 UserControl 中 ItemsSource 内的 Canvas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30136886/

相关文章:

c# - 偏移foreach循环

javascript - 将 css 背景设置为本地存储中的图像

html - 使 Canvas 拉伸(stretch)以填充窗口

windows-store-apps - 在 Windows 应用商店或通用应用中注册应用失败错误

visual-studio-2013 - 如何忽略我的 Windows 应用商店应用程序中的 MSTest 错误消息?

c# - 在 XAML 中使用样式从设置中绑定(bind) Drawing.Color

c# - 文化未应用于多语言网站

c# - 尝试使用 C sharp 中的 catch block

android - 刷新 SurfaceView-->OnClickListener Android 上的 Canvas

c# - 如何修复 Windows 应用商店应用程序解决方案中丢失的程序集引用 'Microsoft.Xaml.Interactivity.dll'?