使用样式在边框中包装控件而不覆盖默认外观

时间:2009-12-07 14:39:06

标签: .net wpf xaml styles

我尝试做的是将控件包装在边框中而不更改其默认外观,也无需创建自定义控件。

我想做相同的事情:

<Border BorderBrush="Red" BorderThickness="3">
  <Button>Hello!</Button>
</Border>

只是对任何控制,而不必实际包装Border中的所有内容。我试图通过使用以下内容修改样式中的Template来实现此目的:

<ControlTemplate TargetType="{x:Type Button}">
  <Border BorderBrush="Red" BorderThickness="3">
    <ContentPresenter />
  </Border>
</ControlTemplate>

这会成功添加边框,但也会清除Button上的任何其他样式。我希望它看起来像一个按钮,周围有一个额外的边框。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

是否需要验证?一个不错的选择是在Adorner图层上绘制边框。

答案 1 :(得分:1)

样式可以继承(使用BasedOn属性),但是您正在处理模板,因此您需要获取当前按钮模板的副本并编辑自己的副本。执行此操作的选项包括:

答案 2 :(得分:0)

我的假设:

  1. 我无法使用默认控件模板
  2. 我想做的就是在边框中包装一个控件
  3. 在任何类型的情况下,该控制都可以是任何类型的控制
  4. 我的解决方案是使用附加的依赖项属性。设置属性后,您将从逻辑树中获取父级。然后,我们将孩子换成包裹在边境的孩子。

    当然,你可以为不同的父母进一步扩展这一点。

    GitHub的解决方案是http://github.com/RookieOne/WrapControlInBorder

    这是一个小代码片段:

                var parent = LogicalTreeHelper.GetParent(elementToWrap);
    
            var panel = parent as Panel;
            if (panel != null)
            {
                panel.Children.Remove(elementToWrap);
                var border = Wrap(elementToWrap);
                panel.Children.Add(border);
                return;
            }
    
            var contentParent = parent as ContentControl;
            if (contentParent != null)
            {
                contentParent.Content = null;
                var border = Wrap(elementToWrap);
                contentParent.Content = border;
                return;
            }