WPF 切角元素

2024-03-15

我正在尝试在 WPF 中创建类似于下图的内容。该控件被设计为我的应用程序中所有内容的基本视图,并将位于带有背景(可能是某种渐变)的 Window 控件内。

要求如下:

  • 三边圆角(左上、左下、右下)
  • 剪掉右上角的选项卡查看角,“剪切区域”后面的背景透明,因此窗口的背景渐变显示(使其看起来真的被剪掉了)
  • 标题区域应该是一个内容容器,因此我可以在其中放入任何内容,例如图标和文本
  • 内容区域需要有一个最小高度,然后在内部内容超过它时增长(不是即时的 - 只需支持其中任何元素的高度)

我已经为此奋斗了几个小时,但作为 WPF 的新手,我开始发现自己在兜圈子。我认为 WPF 的灵活性有很大的好处,但对于刚开始使用的人来说,这几乎太令人畏惧了。

任何帮助将非常感激!谢谢!


我不知道如何“填充”剪辑,所以我用代码制作了剪辑。如果您需要更多帮助添加更多属性来控制颜色等,请告诉我。 开始:

Code:

public class Tabby : HeaderedContentControl
{
    static Tabby()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(Tabby), new FrameworkPropertyMetadata(typeof(Tabby)));
    }

    public double DogEar
    {
        get { return (double)GetValue(DogEarProperty); }
        set { SetValue(DogEarProperty, value); }
    }

    public static readonly DependencyProperty DogEarProperty =
        DependencyProperty.Register("DogEar",
        typeof(double), 
        typeof(Tabby),
        new UIPropertyMetadata(8.0, DogEarPropertyChanged));

    private static void DogEarPropertyChanged(
        DependencyObject obj, 
        DependencyPropertyChangedEventArgs e)
    {
        ((Tabby)obj).InvalidateVisual();
    }

    public Tabby()
    {
        this.SizeChanged += new SizeChangedEventHandler(Tabby_SizeChanged);
    }

    void Tabby_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        var clip = new PathGeometry();
        clip.Figures = new PathFigureCollection();
        clip.Figures.Add(
            new PathFigure(
                new Point(0, 0),
                new[] {
                    new LineSegment(new Point(this.ActualWidth - DogEar, 0), true),
                    new LineSegment(new Point(this.ActualWidth, DogEar), true), 
                    new LineSegment(new Point(this.ActualWidth, this.ActualHeight), true),
                    new LineSegment(new Point(0, this.ActualHeight), true) },
                true)
        );
        this.Clip = clip;
    }
}

通用.xaml

<Style TargetType="{x:Type local:Tabby}">
    <Setter Property="Padding"
            Value="5" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:Tabby}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="auto" />
                        <RowDefinition Height="auto" />
                    </Grid.RowDefinitions>
                    <Border CornerRadius="3,0,0,0"
                            BorderBrush="Black"
                            BorderThickness="1"
                            Background="Black">
                        <ContentPresenter Content="{TemplateBinding Header}"
                                          Margin="{TemplateBinding Padding}" />
                    </Border>
                    <Border CornerRadius="0,0,3,3"
                            BorderBrush="Black"
                            BorderThickness="1"
                            Background="White"
                            Grid.Row="1">

                        <ContentPresenter Content="{TemplateBinding Content}"
                                          Margin="{TemplateBinding Padding}" />
                    </Border>
                </Grid>

            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

使用它:

<my:Tabby DogEar="12"
          x:Name="tabby1">
    <my:Tabby.Header>
        <TextBlock Foreground="White">Header</TextBlock>
    </my:Tabby.Header>
    <my:Tabby.Content>
        <TextBlock Text="Content can be anything" />
    </my:Tabby.Content>
</my:Tabby>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 切角元素 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 如何在单击“阅读更多”按钮或链接时展开文本?

    我有一个 js 函数 可以在两个文本范围之间切换 一种是类折叠的较小文本 另一种是类展开的全文 这是我的js document ready function expanded hide expanded collapsed click fu
  • 高分表

    我希望在我的 Android 应用程序中添加一个 本地 而不是在线 高分表 并且我想了解解决该问题的最佳方法 我有一个用户列表 现在被保存到文件中并作为 User 对象数组读回 高分需要引用此数据以使用用户的姓名和照片等填充表 对于显示器
  • Google Chart Gannt 避免工具提示

    通过研究 我发现 Gannt Google Chart 上显示的工具提示不可自定义 因此我决定覆盖它 捕获由我的 gannt 矩形触发的悬停事件 如下所示 google visualization events addListener ch
  • 如何触发 IModel.BasicAcks?

    我第一次使用 RabbitMQ 的 NET API 我想出了一个对我来说似乎合理的用例 我想创建发布消息并在消息被确认后执行某些操作的发布者 IModel BasicAcks 事件似乎是了解这一点的好方法 所以 我给出版商写了一封信 pri
  • 识别并计算咒语(每组内的独特事件)

    我正在寻找一种有效的方法来识别时间序列中的咒语 运行 在下图中 前三列是我所拥有的 第四列 spell这就是我想要计算的 我尝试过使用dplyr s lead and lag 但这变得太复杂了 我试过了rle但一无所获 ReprEx df
  • 如何在android中检查3g是否活跃

    我正在尝试检查我的手机中的 3G 是否处于活动状态 之后我必须触发一个 Intent 所以请有人帮助我 提前致谢 我最近编写的应用程序的另一个片段 TelephonyManager telManager telManager Telepho
  • 如何在命令类之外获取命令参数?

    我向doctrine fixtures load 命令添加了自定义选项 现在我想知道如何在自定义装置类中获取此命令选项 class LoadUserData implements FixtureInterface ContainerAwar
  • Matlab 中多个字符串的日期

    我必须从两个字符串生成一个日期 字符串或数字 第一个是日期 第二个是时间 我一定在代码中犯了一些错误 因为结果与源数据的串联不同 DIR4 h datestr strcat DIR1 h DIR2 h dd mm yyyy HH MM SS
  • Django 403 CSRF 令牌丢失或不正确

    我遇到过这个问题 但不幸的是仍然不知道如何解决它 表单呈现完美 我输入信息并收到 CSRF 错误 给出的理由是token missing or incorrect View def eventSell request id c c upda
  • 循环 this.props.children 如何测试它们的类型?

    在自定义 React 组件中的以下代码片段中 React Children map this props children child gt if predicate child do stuff else do other stuff p
  • 简单的网络服务器或网络测试框架

    需要测试一个复杂的 Web 应用程序 该应用程序与基于远程第 3 方 CGI 的 Web 服务进行交互 我计划在虚拟网络服务器中实现一些第三方服务 以便我可以完全控制测试用例 寻找一个简单的 python http web 服务器或框架来模
  • C 结构中的填充量是编译器相关的还是明确定义的?

    是C中的填充量struct在标准或编译器和 或目标体系结构中明确定义 我在标准中找不到答案 它是实现定义的 来自 C99 标准第 6 7 2 1 节 结构体或联合对象的每个非位域成员都按照实现定义的方式对齐 适合其类型的方式 可能还有无名的
  • 使用VBA代码从tr获取所有td

    我有一个 tr 它是一个对象并且有 td 我想获取另一个对象变量 tblTD 中的所有 td 为此我用了Set tblTD tr getelementsbytagname td 但是当我检查 tblTD 的长度时 它显示为 0 有人可以建议
  • C# WPF Webbrowser msHTML - 探索 DOM - 查找元素

    我实际上正在使用 WPF 和 WPF WebBrowser 用 C 开发一个个人项目 我真的需要探索 html DOM 元素 就像我们过去在 javascript 或 php 中所做的那样 在我的主窗口中我有这个变量 private msh
  • 将 2D 箱中分散值的平均值绘制为直方图/十六进制图

    我有 3 维分散数据 x y z 我想将 x 和 y 的箱中 z 的平均值绘制为十六进制图或二维直方图 有没有 matplotlib 函数可以做到这一点 尽管这似乎是一个常见问题 但我只能提出一些非常麻烦的实现 例如 像这样的东西 除了颜色
  • #if canImport(CoreImage) 在 swift 包管理器中不起作用

    我制作使用 CoreImage 的库 库支持 Cocoapods Carthage 和 Swift 包管理器 当我在 Swift 包管理器中构建它时 我收到此错误 Undefined symbols for architecture x86
  • 空 ByteArrayOutputStream / ZipOutputStream 的长度 = 22?

    我有一个关于流大小的小问题 这是我的尝试 ByteArrayOutputStream outStream new ByteArrayOutputStream ZipOutputStream zipStream new ZipOutputSt
  • 从 SQL Server 导出到带有列标题的 Excel?

    我有一个大约有 20 列的查询 我想将其导出到带有列标题的 Excel 文件 我以为这很容易弄清楚 但运气不好 我在网上搜索并发现了一项建议 但最终没有奏效 所以我陷入了困境 工具 gt 选项 选择 查询结果 gt SQL Server g
  • Angular 2.0 和 ng 风格

    我正在构建一个 Angular 2 0 组件 我想动态控制它的样式 使用ng style 快速查看 Angular 2 的文档后 我尝试了以下操作 div class theme preview fontSize div 并看到尺寸实际上打
  • WPF 切角元素

    我正在尝试在 WPF 中创建类似于下图的内容 该控件被设计为我的应用程序中所有内容的基本视图 并将位于带有背景 可能是某种渐变 的 Window 控件内 要求如下 三边圆角 左上 左下 右下 剪掉右上角的选项卡查看角 剪切区域 后面的背景透