C#WPF)动态添加控件时有时会缺少DropShadowEffect [英] C# WPF) DropShadowEffect is sometimes missing when dynamically adding a control

查看:114
本文介绍了C#WPF)动态添加控件时有时会缺少DropShadowEffect的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

foreach (DataRow dr in dt.Rows)
{
    Rectangle rectangle_timeline = new Rectangle();
    rectangle_timeline.Height = 19;
    rectangle_timeline.Cursor = Cursors.Hand;

    rectangle_timeline.Effect = new DropShadowEffect
    {
        Color = new Color { A = 255, R = 0, G = 0, B = 0 },
        Direction = 315,
        ShadowDepth = 5,
        Opacity = 1
    };

    Grid_Timeline.Children.Add(rectangle_timeline);
}

我使用上面的简单代码动态添加了一个矩形,如图所示。

I dynamically add a Rectangle with above simple code as shown image.

但是,有时候,随机会有一些没有DropShadowEffect的矩形,例如最低的黄色矩形和1个蓝色的矩形。

However, sometimes, randomly, there're rectangles without DropShadowEffect like yellow rectangles and 1 blue rectangle at the lowest.

如您所见,如果添加了矩形,则必须使用DropShadowEffect的代码。

As you see the code, if a rectangle is added, the code for DropShadowEffect should have to be worked.

我想知道为什么会这样。

I'm wondering why this is happening.

谢谢!

已添加XAML代码-

<Grid x:Name="Grid_Timeline" ScrollViewer.VerticalScrollBarVisibility="Auto" UseLayoutRounding="True" Width="1159" HorizontalAlignment="Left" VerticalAlignment="Top" SnapsToDevicePixels="True">
</Grid>

添加了要重新生成的最小代码-

Minimal code to re-produce is added-

private void Window_Loaded(object sender, RoutedEventArgs e)
{
        int count_each_category = 0;
        string current_therapeutic_category = String.Empty;

        foreach (DataRow dr_test in dt.Rows)
        {
            if (dr_test != null)
            {
                if (current_category == String.Empty)
                {
                    count_each_category++;

                    current_category = dr_test["category"].ToString();
                }
                else
                {
                    if (current_category == dr_test["category"].ToString())
                    {
                        // empty
                    }
                    else
                    {
                        count_each_category++;

                        current_category = dr_test["category"].ToString();
                    }
                }

                Rectangle rectangle_test = new Rectangle();

                rectangle_test.HorizontalAlignment = HorizontalAlignment.Left;
                rectangle_test.VerticalAlignment = VerticalAlignment.Top;

                rectangle_test.Margin = new Thickness(119 + (((Convert.ToDateTime(dr_test["date"]) - DateTime.Today.AddYears(-10)).TotalDays) * 0.27), count_each_category * 50, 0, 0);

                rectangle_test.Width = 0.27 * Convert.ToInt32(dr_test["howlong"]);
                rectangle_test.Height = 19;

                rectangle_test.Effect = new DropShadowEffect
                {
                    Color = new Color { A = 255, R = 0, G = 0, B = 0 },
                    Direction = 315,
                    ShadowDepth = 5,
                    Opacity = 1
                };

                rectangle_test.Fill = Brushes.LightGreen;

                Grid_Timeline.Children.Add(rectangle_test);
            }
        }
}

WPF Window的XAML代码

XAML code of WPF Window

<Window x:Class="OperationSWdummy.Green_Timeline"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:OperationSWdummy"
    mc:Ignorable="d"
    Title="Green_Timeline" Width="1165" Background="White" ResizeMode="CanMinimize" ScrollViewer.VerticalScrollBarVisibility="Auto" UseLayoutRounding="True" SnapsToDevicePixels="True" Loaded="Window_Loaded">
<Grid x:Name="Grid_Timeline" ScrollViewer.VerticalScrollBarVisibility="Auto" UseLayoutRounding="True" Width="1159" HorizontalAlignment="Left" VerticalAlignment="Top" SnapsToDevicePixels="True">
</Grid>
</Window>

dt的原始数据(DataTable)

Raw data of dt (DataTable)

date        datetime

category    NVARCHAR

howlong     int

   date     category howlong 
2015-01-25    HHH      60 
2014-04-03    AAA      60 
2015-01-25    DDD      60 
2014-04-03    UUU      60 
2015-01-25    CCC      60 
2015-11-07    PPP      30 
2015-01-25    TTT      60 
2015-11-07    MMM      30 
2015-02-22    MMM      30 
2015-11-07    VVV       8 

以上最小代码的结果
/ a>

Result of above minimal code

另一个随机创建矩形的最小代码-

Another minimal code to create rectangles randomly-

for (int k = 0; k < 191; k++)
        {
            Rectangle rec_test = new Rectangle();
            rec_test.Margin = new Thickness(random_margin.Next(100, 1000), 29 * (k % 10), 0, 0);
            rec_test.Width = random_width.Next(10, 40);
            rec_test.HorizontalAlignment = HorizontalAlignment.Left;
            rec_test.VerticalAlignment = VerticalAlignment.Top;
            rec_test.Height = 14;
            rec_test.Cursor = Cursors.Hand;
            rec_test.Effect = new DropShadowEffect
            {
                Color = new Color { A = 255, R = 0, G = 0, B = 0 },
                Direction = 315,
                ShadowDepth = 5,
                Opacity = 1
            };

            rec_test.Fill = Brushes.Green;

            Grid_Timeline.Children.Add(rec_test);
        }


推荐答案

您是否尝试过使用画布放置矩形?

Have you tried to use Canvas to place your rectangles?

具有Canvas来放置形状(例如矩形,圆形或什至具有随机位置的图形路径)的效果比放在固定布局容器(例如)上更好网格 StackPanel

Having Canvas to place your shapes such as rectangles, circles, or even graphical paths with random locations is better than placing on fixed layout container such as Grid or StackPanel.

众所周知,如果只是将具有诸如DropShadow之类效果的形状放置在固定布局(具有任意X,Y位置)上,例如 Grid StackPanel ,您的形状可能会被剪切。因为将始终在渲染时检查形状边缘的像素边界,并且这通常是由于在尝试重新计算固定布局控件的边缘时渲染计算重叠造成的。

It is quite known that if you just placed shapes with effects such as DropShadow on fixed layout (with arbitrary X,Y locations) such as Grid and StackPanel, your shapes may be clipped. Because the shapes edges will always be checked for pixel boundaries at render time, and often this is caused by overlapped rendering calculations when it tries to recalculate edges of fixed layout controls.

这篇关于C#WPF)动态添加控件时有时会缺少DropShadowEffect的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆