【问题标题】:Access a Canvas inside an ItemsSource in a UserControl, from the MainPage从 MainPage 访问 UserControl 中 ItemsSource 内的 Canvas
【发布时间】:2015-07-20 03:22:06
【问题描述】:

我的MainPage 中有一个FlipView。它是ItemTemplate 绑定到一个名为landscapeControlUserControl。它的ItemsSource 绑定到一个名为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; }
    }

我的图像显示完美。我想要的只是三件事:

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 变量始终为空!我想绑定我的Canvas,所以我每两张图片都有一个Canvas? 那可能吗?

【问题讨论】:

  • 在您的 flipView_SelectionChanged 事件中,您可以调用 e.AddedItems 吗?如果是这样,请更改您的代码: if (flipView1.Items.Count > 0) { var myCanvas = pc.getCanvas(); m_CanvasManager = 新 CanvasManager(myCanvas); } to if (e.AddedItems.Count > 0) { var myCanvas = (e.AddedItems as LandscapeControl).getCanvas(); m_CanvasManager = 新 CanvasManager(myCanvas); }

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


【解决方案1】:

一种方法是使用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;
        }
    }

希望这会有所帮助!

【讨论】:

  • xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" xmlns:Core="using:Microsoft.Xaml.Interactions.Core" 添加到我的 UserControl 时无法识别。如何定义Interactivity?还是我应该下载的参考资料?
  • 添加参考,然后在扩展选项卡中选择行为 SDK。
  • 已实施!并且返回的 inkCanvas 始终为 null :(
  • 是的,我和你的一样,但它仍然是空的。你介意检查我的第二个问题吗?这是我想在这里做的更简单的事情stackoverflow.com/questions/30236107/…
【解决方案2】:

好吧,经过长时间的搜索,在 Windows Store Apps 中:我们无法访问位于 FlipView 内的 Canvas,无论它直接在 FlipView 内还是在FlipViewDataTemplate

【讨论】:

  • 不正确。 SelectedItemMyLandscape 的类型,而不是 landscapeControl。如果你正确绑定了inkCanvas,你应该可以从((MyLandscape)flipView1.SelectedItem).inkCanvas获取Canvas实例。
  • 真正的问题是如何正确绑定inkCanvas?
  • 你的项目中实现了 Command & CommandParameter 吗?
  • 不!我可以按照任何链接来实施它们吗?
  • 我正在准备这个问题的答案,再给我几分钟时间。 :)
【解决方案3】:

从以下位置更改您的代码:

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

【讨论】:

  • 我在var myCanvas = (e.AddedItems[0] as landscapeControl).getCanvas(); 遇到了 NullReferenceException
  • Layale,你有landscapeControl用户控件和MyLandscape类,landscapeControl和MyLandscape是什么关系?
  • 不应该有landscapeControl.xaml 和landscapeControl.xaml.cs 吗?
  • 当然我有landscapeControl.xamllandscapeControl.xaml.cslandscapeControl中的2张图片绑定到MyLandscape类生成的图片上。我在MyLandscape 类中添加了一个Canvas,但我不知道如何将它绑定到landscapeControl 中的Canvas,所以我可以为每个@ 的每2 个图像拥有一个Canvas 987654333@ 在FlipView
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
相关资源
最近更新 更多