【问题标题】:Silverlight - Exposing canvas within user controlSilverlight - 在用户控件中公开画布
【发布时间】:2011-11-18 01:11:16
【问题描述】:

给定一个自定义用户控件,其中包含一个画布。

<Grid>
    <Border BorderBrush="Black" BorderThickness="3">
        <Canvas x:Name="CanvasDropArea" Background="#FFF7BDBD"/>
    </Border>
</Grid>

有没有办法公开画布以允许将其他控件附加到上述用户控件中?

<CustomControlWithCanvas>
   <Canvas>
        <!--other user control-->
   <Canvas>
</CustomControlWithCanvas>

我尝试将其作为属性公开,但失败了,因为它被视为普通属性,而不是允许附加 UIElements 的 Collection。但是,我可以通过检索画布并手动添加它,使用后面的代码将控件附加到元素上。
那么暴露画布的正确方法应该是什么?允许它在设计时改变,并保留画布 TOP 和左依赖属性。

【问题讨论】:

  • 我想知道你为什么不能只使用普通的画布?您需要将它放在用户控件中的原因是什么?
  • 我想要实现的是有一个边框和一些连接到画布的自定义行为,所以我不会重复这个(总共 8 个画布),我只是将它作为一个通用的用户控件.所以将来如果我要附加其他行为,我只需要编辑我的主要用户控件。还是有更好的方法来实现这一点?
  • 这些行为是否与BorderCanvas 相关联?
  • 我的用户控件包含的是(边框、画布和 2 个按钮 [左右]),它们的行为是鼠标事件列表,它的工作方式类似于媒体播放器,具有将鼠标悬停[拖动对象]到画布会使边框更改(变为虚线),如果有鼠标进入,则会出现2个按钮,并隐藏鼠标悬停。这将导致一组这些控件在网格内布局,允许用户将对象从这些“CustomCanvas”控件中的一个拖动到另一个。我想把它包起来。
  • 我认为实现这一点的一种方法是使用一种行为,您可以在后面的代码中手动将您的对象添加到画布中,对吧?只需使用一个行为来封装这段代码并将行为附加到您的用户控件。

标签: c# silverlight silverlight-4.0 canvas


【解决方案1】:

试试这个 - 将控件的类型从 UserControl 更改为 ContentControl,放入 Canvas 并以某种方式将 ContentPresenter 的 Content 属性绑定到控件的 Content 属性 - 也许通过命名控件并使用 .

以更标准的方式 - 您可以将其实现为模板化/自定义控件而不是 UserControl,将模板放入 Themes/Generic.xaml 而不是 MyControl.xaml,在构造函数中定义 DefaultStyleKey,定义 TemplateParts 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-07
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多