【问题标题】:Custom shaped WPF control自定义形状的 WPF 控件
【发布时间】:2012-01-08 22:27:42
【问题描述】:

我正在寻找一种方法来创建具有自定义形状的 WPF 控件,该控件将能够包含子控件。

为了简化问题,我需要一个非矩形面板之类的东西。

更新: 我需要一个“真正的”自定义形状。不捕获形状外的鼠标事件等等。

【问题讨论】:

  • WPF 控件采用其内容的形状——如果您的控件只包含一个椭圆,那么它就是椭圆形的。它不会响应椭圆外的鼠标点击。所以只要制作一个你想要的形状的背景,然后在上面放东西。
  • @adonz 为什么不能使用控件的外部边界来保持控件的免费为空? Null 将使您的控件对鼠标透明。

标签: wpf


【解决方案1】:

我会从 ContentControl 派生,然后作为孩子,我会在其中放置一个内容展示器,在内容展示器中,您可以放置​​任何面板,例如可以在其中托管其他元素的画布。我会将其作为应用到您的控件的模板来执行,并将演示者的内容绑定到控件的内容属性,这样添加到控件的内容属性会将其添加到将显示它的演示者中。这是一个例子:

 <ControlTemplate TargetType="MyCustomControl">
                <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
                    <ContentPresenter Content="{TemplateBinding ContentControl.Content}"/>
                    <Ellipse x:Name="myEllipse Background="Green"/> <!-- the control won't catch events outside it-->
                </Grid>
 </ControlTemplate>

然后只需将模板应用到您的控件即可,一切就绪,如果您想在其中托管其他元素,请不要忘记将面板作为子项添加到内容中。

【讨论】:

  • 实际上,我不知道如何制作自定义形状的所有内容。附言查看我的更新。
  • 它不会捕捉到形状之外,如果你想包含子元素而不是你必须这样做。如果您想在内容演示器之外使用自定义形状,只需将其添加到网格中即可。它不会在形状之外捕获鼠标想要的东西,并且控件将采用提供的形状的形状。如果你尝试它,你会发现它有效。如果要制作自定义形状,可以从 shape 继承并覆盖定义的几何属性。有关模板中的自定义形状,请参阅上面的更新代码。
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多