C#WPF)动态添加控件时,有时会丢失DropShadowEffect

时间:2021-09-27 15:54:16

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.

我动态添加一个带有上面简单代码的Rectangle,如图所示。

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

然而,有时,随机地,没有DropShadowEffect的矩形像黄色矩形和最低的1个蓝色矩形。

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

当您看到代码时,如果添加了一个矩形,则必须使用DropShadowEffect的代码。

I'm wondering why this is happening.

我想知道为什么会这样。

Thank you !

谢谢 !

XAML code added-

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

XAML code of WPF Window

WPF窗口的XAML代码

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

Raw data of dt (DataTable)

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 

Result of above minimal code C#WPF)动态添加控件时,有时会丢失DropShadowEffect

以上最小代码的结果

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

2 个解决方案

#1


4  

Have you tried to use Canvas to place your rectangles?

您是否尝试使用Canvas放置矩形?

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.

使用Canvas放置您的形状(如矩形,圆形,甚至是随机位置的图形路径)比放置在固定布局容器(如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.

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

#2


2  

Could be a driver problem with your graphics hardware. Try disabling hardware acceleration and see if it helps.

可能是您的图形硬件的驱动程序问题。尝试禁用硬件加速,看看它是否有帮助。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
         RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
    }
}

In general I advise against using the DropShadowEffect as it will have a significantly negative impact on rendering performance.

一般来说,我建议不要使用DropShadowEffect,因为它会对渲染性能产生显着的负面影响。

#1


4  

Have you tried to use Canvas to place your rectangles?

您是否尝试使用Canvas放置矩形?

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.

使用Canvas放置您的形状(如矩形,圆形,甚至是随机位置的图形路径)比放置在固定布局容器(如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.

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

#2


2  

Could be a driver problem with your graphics hardware. Try disabling hardware acceleration and see if it helps.

可能是您的图形硬件的驱动程序问题。尝试禁用硬件加速,看看它是否有帮助。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
         RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
    }
}

In general I advise against using the DropShadowEffect as it will have a significantly negative impact on rendering performance.

一般来说,我建议不要使用DropShadowEffect,因为它会对渲染性能产生显着的负面影响。