none
GuideLineSet 在 Grid.RowDefinition 所定义的空间内就失效了,这是为什么? RRS feed

  • 问题

  • 创建一个UserControl.在OnRender中画多条横线,并使用GuideLineSet 像素对齐处理,代码如下

           protected override void OnRender(DrawingContext drawingContext)
            {
                base.OnRender(drawingContext);
                double interval = this.ActualHeight / 35;
                for (int i = 1; i < interval; i++)
                {
                    Point x = new Point(0, i * 35);
                    Point y = new Point(this.ActualWidth, i * 35);
    
                    GuidelineSet guideLines = new GuidelineSet();
                    guideLines.GuidelinesX.Add(x.X + pen.Thickness / 2);
                    guideLines.GuidelinesX.Add(x.X + pen.Thickness / 2);
                    guideLines.GuidelinesY.Add(x.Y + pen.Thickness / 2);
                    guideLines.GuidelinesY.Add(y.Y + pen.Thickness / 2);
                    drawingContext.PushGuidelineSet(guideLines);
                    drawingContext.DrawLine(pen, x, y);
                    drawingContext.Pop();
                }
    }

    将这个UserControl添加到一个Window窗体中

        <Grid>
            <my1:UserControl1>
        </Grid>

    没有任何问题,直线显示非常清晰,拖动窗体Onrender也非常正常

    但是如果添加Grid.RowDefinition

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="50*"/>
                <RowDefinition Height="50*"/>
            </Grid.RowDefinitions>
            <my1:UserControl Grid.Row="0" x:Name="UCanvas"/>
            <my1:UserControl Grid.Row="1" x:Name="UCanvas1"/>
        </Grid>

    GuideLineSet 好像就失去了作用,横线非常的不清晰。另外如果 <RowDefinition Height="300"/> Height为固定的值得时候,GuideLineSet 也是起作用的!

    可是现在的需求就是需要按照比例去放置两个控件  

    <RowDefinition Height="50*"/>
    <RowDefinition Height="50*"/>

    我应该如何处理,哪位大侠帮帮忙?

    2012年5月3日 8:42

答案

  • 你应该先了解下 BitmapCache 是如何作用的和其原理。 为了提高绘图性能,WPF引入BitmapCache,他的作用是可视元素或元素的可视化树缓存为位图图像,然后显示在界面上。我们知道,如果不缓存的话,WPF的图形信息是矢量的,需要根据用户的缩放去不断的计算,而位图则是非矢量的,所以导致的结果是如果请求放大后,在缓存没有更新情况下,会出现模糊现象。

    但是 BitmapCache  以帮我们改善缓存图像的效果,RenderAtScale 属性。我们可以适当的提高这个值,以要求缓存的位图基于的缩放比较大。但千万不要将此值设置过大,否则适得其反,系统反而会花大量时间去缓存一个高清晰度的位图而导致性能损失。

    还有,对你你的问题,你也可以适当地将pen.Thickness 的值设置大一些,我测试的时候用了2,在 RenderAtScale =1 的情况效果良好。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月4日 5:33
    版主

全部回复

  • 还有一点忘了说了,就是UserControl的this.CacheMode = new BitmapCache();

    如果把这句去掉了,也能正常显示。

    就是如果 没有  this.CacheMode = new BitmapCache();

    <Grid>
           
    <my1:UserControl1>
     
    </Grid>

    <Grid>
           
    <Grid.RowDefinitions>
               
    <RowDefinition Height="50*"/>
               
    <RowDefinition Height="50*"/>
           
    </Grid.RowDefinitions>
           
    <my1:UserControl Grid.Row="0" x:Name="UCanvas"/>
           
    <my1:UserControl Grid.Row="1" x:Name="UCanvas1"/>
       
    </Grid>

    都能正常显示。

    但是如果 this.CacheMode = new BitmapCache();


    <Grid>
           
    <my1:UserControl1>
    </Grid>

    能正常显示

    <Grid>
           
    <Grid.RowDefinitions>
               
    <RowDefinition Height="50*"/>
               
    <RowDefinition Height="50*"/>
           
    </Grid.RowDefinitions>
           
    <my1:UserControl Grid.Row="0" x:Name="UCanvas"/>
           
    <my1:UserControl Grid.Row="1" x:Name="UCanvas1"/>
       
    </Grid>

    不能正常现象



    2012年5月3日 8:57
  • 你应该先了解下 BitmapCache 是如何作用的和其原理。 为了提高绘图性能,WPF引入BitmapCache,他的作用是可视元素或元素的可视化树缓存为位图图像,然后显示在界面上。我们知道,如果不缓存的话,WPF的图形信息是矢量的,需要根据用户的缩放去不断的计算,而位图则是非矢量的,所以导致的结果是如果请求放大后,在缓存没有更新情况下,会出现模糊现象。

    但是 BitmapCache  以帮我们改善缓存图像的效果,RenderAtScale 属性。我们可以适当的提高这个值,以要求缓存的位图基于的缩放比较大。但千万不要将此值设置过大,否则适得其反,系统反而会花大量时间去缓存一个高清晰度的位图而导致性能损失。

    还有,对你你的问题,你也可以适当地将pen.Thickness 的值设置大一些,我测试的时候用了2,在 RenderAtScale =1 的情况效果良好。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月4日 5:33
    版主
  • 还有,根据你的代码,如果只是要求画横线竖线,可以考虑加上 绘制边缘选项为 锐度:

        <local:UserControl1 Grid.Row="0" x:Name="UCanvas" RenderOptions.EdgeMode="Aliased"/>

    不过这个值很难满足你的线宽小于0.5, 过小线宽他就无法显示了,一个像素无法显示过细小的线条。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月4日 5:41
    版主