背景颜色阻碍 WPF UserControl 内容

2024-01-08

我有一个UserControl,在 XAML 中引用如下:

<local:ColumnGraphRenderCtrl x:Name="graphCtrl" Grid.Column="1" 
    Height="Auto" Width="Auto"/>

The UserControl有问题的有几个矩形形状,它们显示得很好。

However,如果我指定一个Backgroundcolor,指定的颜色会遮挡矩形,只显示颜色。例如:

<local:ColumnGraphRenderCtrl x:Name="graphCtrl" Background="Blue" Grid.Column="1" 
    Height="Auto" Width="Auto"/>

(如果我将颜色更改为“透明”,矩形就会变得可见。)

我也尝试使用ControlTemplate为了UserControl(作为Style),但我得到了相同的结果(即背景颜色阻挡了 UserControl 的内容)。

我查了一下控制.背景属性于MSDN http://msdn.microsoft.com/en-us/library/system.windows.controls.control.background%28v=vs.110%29.aspx其中提供了以下备注:

背景属性仅适用于静止状态 控制。控件的默认样式指定其外观 当控件的状态改变时。例如,如果您设置 按钮上的背景属性,按钮仅在以下情况下才具有该值: 它没有被按下或禁用。如果你想创建一个控件 有更高级的背景定制,必须定义 控件的样式。

该属性仅影响其模板使用 背景属性作为参数。在其他控件上,此属性 没有影响。

MSDN中的注释有何意义,如何指定背景颜色而不遮挡控件内容?

编辑:如果有影响的话,内容控件(矩形)是在代码隐藏中手动添加的。

用户控制代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace GraphingWithShapes
{
    public partial class ColumnGraphRenderCtrl: UserControl
    {
        private ObservableCollection<NameValuePair> _dataPoints = null;
        private List<Color> _columnColors = new List<Color>() { Colors.Blue, Colors.Red, Colors.Green };

        public ColumnGraphRenderCtrl()
        {
            InitializeComponent();
        }

        public void SetData(ObservableCollection<NameValuePair> data)
        {
            _dataPoints = data;
            _dataPoints.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_dataPoints_CollectionChanged);
            InvalidateVisual();
        }

        void _dataPoints_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            InvalidateVisual();
        }

        public double GetLargestValue()
        {
            double value = 0;

            foreach (NameValuePair nvp in _dataPoints)
            {
                value = Math.Max(value, nvp.Value);
            }

            return value;
        }

        protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
        {
            base.OnMouseDoubleClick(e);
        }

        protected override void OnRender(DrawingContext drawingContext)
        {
            if (_dataPoints != null)
            {
                double spaceToUseY = ActualHeight * 0.8;
                double spaceToUseX = ActualWidth * 0.8;
                double barWidth = spaceToUseX / _dataPoints.Count;
                double largestValue = GetLargestValue();
                double unitHeight = spaceToUseY / largestValue;

                double bottom = ActualHeight * 0.9;
                double left = ActualWidth * 0.1;

                Brush fillBrush;
                Pen outlinePen = new Pen(Brushes.Black, 1);
                int nIndex = 0;
                Rect rect;
                double height;

                foreach (NameValuePair nvp in _dataPoints)
                {
                    fillBrush = new SolidColorBrush(_columnColors[nIndex % _columnColors.Count]);

                    height = (nvp.Value * unitHeight);
                    rect = new Rect(left, bottom - height, barWidth, height);
                    drawingContext.DrawRectangle(fillBrush, outlinePen, rect);

                    left += rect.Width;
                    nIndex++;
                }
            }
        }
    }
}

为了编写一个通过重写的方式进行渲染的自定义控件OnRender你不应该从中派生的方法UserControl甚至Control,因为他们通过ControlTemplate,这也用Background刷子。所有这些都是在 OnRender 方法之外完成的,因此重写它并且不调用基类的 OnRender 不会有帮助。

相反,派生自FrameworkElement or UIElement,声明一个Background属性并在进行其余渲染之前用背景填充控制区域:

public class CustomControl : FrameworkElement
{
    public static readonly DependencyProperty BackgroundProperty =
        Control.BackgroundProperty.AddOwner(typeof(CustomControl));

    public Brush Background
    {
        get { return (Brush)GetValue(BackgroundProperty); }
        set { SetValue(BackgroundProperty, value); }
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext); // just good practice
        drawingContext.DrawRectangle(Background, null, new Rect(RenderSize));

        // your rendering code goes here...
    }
}

您可能会在以下位置找到更多信息控件创作概述 http://msdn.microsoft.com/en-us/library/ms745025.aspxMSDN 上的文章。有一节是关于从 FrameworkElement 派生的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

背景颜色阻碍 WPF UserControl 内容 的相关文章

  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK

随机推荐

  • PowerShell InvokeGet 找不到目录属性

    我们需要检索活动目录中有关 终端服务 的信息 为此 我创建了一个在大多数情况下都能正常工作的函数 但是 对于某些用户 我们遇到了问题 代码 Function Get ADTSProfile CmdletBinding Param Param
  • 我们实际上可以将两组多个变量传递到 dplyr 中的 mutate 中吗

    This question https stackoverflow com questions 66174874 using dplyracross with two sets of variables尽管三个答案让我在思考这个问题时产生了
  • 如何在 Rail 2.3.5 中生成 mongoid.yml 配置?

    正如标题所示 如何在 Rail 2 3 5 上生成默认的 mongoid yml 配置文件 我尝试使用 rails generated mongoid config 命令 但它只是生成一个新应用程序 而且 我想在 mongoid 中使用 h
  • 仅使用gunicorn、django 和whitenoise 如何为媒体提供服务?

    我的网站终于可以正常工作了 但在以下情况下无法提供媒体文件debug False我应该怎么办 我经历了地狱般的尝试让它与 nginx 一起工作本教程 https www digitalocean com community tutorial
  • 如何在 Bash 脚本中运行 sudo 命令?

    我想运行以下示例 bash 脚本 该脚本需要 sudo 密码才能执行命令 bin bash kinit needs sudo password vi hello txt 运行上述脚本时 它要求输入密码 我如何在命令本身中传递用户名和密码 或
  • 检查一个数是否能被3整除[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 编写代码来确定一个数字是否能被 3 整除 该函数的输入是single位 0 或 1 如果到目前为止收到的数字是可被 3 整除的数字的二进制表示形式 则
  • 如何动态找出具有自定义属性的所有方法

    我有一个简单的挑战 我动态地需要找出 C 中具有特定属性的所有方法 我将从另一个应用程序动态加载程序集 并且需要找出确切的方法 程序集如下所示 基础 dll Class Base testmethod public void method1
  • Twitter 以编程方式添加照片

    我为 Firefox 制作了裁剪屏幕截图和上传插件 我想带来一个允许用户发布图像的功能 手动 像人类一样 的过程是这样的 打开 twitter com 如果未登录 请告诉用户登录 点击 新推文 就完成了 Attach images by d
  • 比较两个 git 存储库(包括所有分支)

    我有同一个 git 存储库的两个分支 我想检查它们是否完全相同 因此可以安全地删除其中一个而不丢失任何信息 虽然我知道如何比较单个分支 但我想问是否有一种简单的方法来比较所有分支 标签等 最快的方法是添加第二个遥控器并比较输出git ls
  • 如何用 C++ 编写“meta if else if..”?

    我刚刚学习 C 元编程的基础知识 我认为很高兴看到其他人如何解决以下问题 另外 很高兴看到使用 Boost 元编程库的解决方案 因为我认为它们对我来说是黑暗的角落 那么问题来了 是否可以重写得更优雅呢 假设我们有以下结构 template
  • 如何使用 mocha 和 supertest 测试带有标头参数的 Express Rest api?

    我必须测试我的其余 api 某些路由需要用户身份验证令牌的 http 请求标头中的值 我已将有趣的业务逻辑分离为纯 JavaScript 代码 但我找不到方法来测试在 http 请求标头中需要令牌的路由 欢迎摩卡和 或超级测试的任何其他替代
  • Bootstrap 响应式输入表单字段

    我正在使用 input lg 使表单字段变大 我的期望是 当视口缩小时 引导程序默认小于 768px 表单字段会变小并采用正常设置 但事实并非如此 有任何想法吗 bootstrap 可以处理这种情况吗 UPDATE HTML
  • 为什么抽象类有虚函数表?

    关于this https stackoverflow com questions 2592438 does an abstact classes have a vtable post 对于使用 vtable 的实现 答案是 是的 通常 你
  • 三角形 - 三角形相交测试

    我想知道是否有一些教程或指南来理解和在 3D 环境中实现三角形 三角形相交测试 我不需要知道交叉点发生在哪里 只需要知道发生了交叉点 我本来打算按照理论 pdf 来实现它 但我很困惑 计算三角形 2 的平面方程 如果三角形 1 的所有点都在
  • Spring中@Valid注解表示什么?

    在下面的示例中 ScriptFile参数标有 Valid注解 什么是 Valid注释做什么 RequestMapping value scriptfile method RequestMethod POST public String cr
  • Shapely:字符串中的多边形?

    我保存了一些形状多边形的字符串表示 POLYGON 51 0 3 0 51 3 3 61 51 3 3 0 51 0 3 0 有没有一些快速的方法可以直接将其转换回 Polygon 类型 或者我是否需要手动解析字符串来创建 Polygon
  • 如何将双精度数组的数据帧转换为向量?

    我有以下数据帧 其中包含双精度数组 需要将其转换为向量才能将其传递给 ML 算法 谁能帮我这个 fList org apache spark sql DataFrame features array
  • sklearn Logistic 回归 ValueError: X 每个样本有 42 个特征;期待 1423

    我被困在试图解决一个问题 这就是我想做的 我想使用逻辑回归预测缺失值 Nan 分类值 这是我的代码 df 1 我的数据集仅在 Metier 功能中缺少值 我试图预测的缺少值 X train pd get dummies df 1 df 1
  • Google 日历 api 出现错误,例如“domain”:“global”、“reason”:“notFound”、“message”:“Not Found”

    我尝试从日历示例中获取事件列表here https developers google com calendar api v3 reference events list 无论我选择哪一处房产 使用时 我总是收到 404 未找到 错误 任何
  • 背景颜色阻碍 WPF UserControl 内容

    我有一个UserControl 在 XAML 中引用如下