C#WPF)动态添加控件时有时会缺少DropShadowEffect

时间:2018-10-06 14:07:53

标签: c# wpf dynamic dropshadoweffect

enter image description here

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

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

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

正如您所看到的代码,如果添加了矩形,则必须处理DropShadowEffect的代码。

我想知道为什么会这样。

谢谢!

已添加XAML代码-

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

添加了要重现的最小代码-

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窗口的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>

dt(数据表)的原始数据

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

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

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 个答案:

答案 0 :(得分:4)

您是否尝试过使用s = df.groupby([df["TimeStamp"].dt.year, df["TimeStamp"].dt.hour]).mean() s = s.rename_axis(['Year','Hour']) #another solution #s.index.names = ['Year','Hour'] print (s) value Year Hour 2014 0 1 1 1 放置矩形?

具有Canvas来放置诸如矩形,圆形甚至是具有随机位置的图形路径之类的图形要比置于固定布局容器(例如CanvasGrid)上更好。

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

答案 1 :(得分:2)

可能是图形硬件的驱动程序问题。尝试disabling hardware acceleration,看看是否有帮助。

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

通常我建议不要使用DropShadowEffect,因为它会对渲染性能产生明显的负面影响。