代码之家  ›  专栏  ›  技术社区  ›  James Gregory

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

  •  1
  • James Gregory  · 技术社区  · 16 年前

    我要做的是在不更改控件的默认外观的情况下在边框中包装控件,并且不必创建自定义控件。

    我想做同样的事情:

    <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 回复  |  直到 14 年前
        1
  •  2
  •   LBugnion    16 年前

    是否需要验证?一个好的选择是在装饰层上绘制边框。

        2
  •  1
  •   Rob Fonseca-Ensor    16 年前

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

        3
  •  0
  •   JB.    16 年前

    我的假设:

    1. 我不能乱用默认的控件模板
    2. 我只想在边框中包装控件
    3. 在任何情况下,该控件都可以是任何类型的控件

    我的解决方案是使用附加的依赖属性。设置属性后,您将从逻辑树中获取父级。然后我们把孩子和一个裹在边界上的孩子交换出去。

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

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