Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Четкость линий в WPF.


Автор: jenik15 19.11.2009, 23:46
Я вот создал приложение и рисую в одном методе сразу два разных типа линий. 
Объясните мне, пожалуйста, почему сетка не такая же четкая, как и линии. В коде все выглядит совершенно одинаково.SnapsToDevicePixels усановлен в true.

Код

foreach(var line in processor.ShowGrid())
                    {
                          Wpf.Line lineToAdd = new System.Windows.Shapes.Line();
                        lineToAdd.X1 = line.Point1.X;
                        lineToAdd.X2 = line.Point2.X;
                        lineToAdd.Y1 = line.Point1.Y;
                        lineToAdd.Y2 = line.Point2.Y;
                        lineToAdd.Stroke = System.Windows.Media.Brushes.Black;
                        lineToAdd.StrokeThickness = 1;
                       
                        this.graphicOutput.Children.Add(lineToAdd);
                    }
                    foreach (var line in lines)
                    {
                        Wpf.Line lineToAdd = new System.Windows.Shapes.Line();
                        lineToAdd.X1 = line.Point1.X;
                        lineToAdd.X2 = line.Point2.X;
                        lineToAdd.Y1 = line.Point1.Y;
                        lineToAdd.Y2 = line.Point2.Y;
                        lineToAdd.Stroke = System.Windows.Media.Brushes.Black;
                        lineToAdd.StrokeThickness = 1;
                        this.graphicOutput.Children.Add(lineToAdd);
                    }

http://ipicture.ru/

Автор: Partizan 20.11.2009, 09:47
SnapsToDevicePixels обычно помогает преодолеть такую вот "размытость" smile

Автор: tol05 20.11.2009, 11:38
Цитата(Partizan @  20.11.2009,  08:47 Найти цитируемый пост)
SnapsToDevicePixels обычно помогает преодолеть такую вот "размытость" smile

Цитата(jenik15 @  19.11.2009,  22:46 Найти цитируемый пост)
SnapsToDevicePixels усановлен в true


а теперь вопрос )
Код

this.graphicOutput.Children.Add(lineToAdd);

что такое graphicOutput и кто его родители? Вообще как выглядит VisualTree до этого элемента?

Автор: jenik15 20.11.2009, 11:56
graphicOutput это Grid у него установлен SnapsToDevicePixels 
родительский у него также Grid LayoutRoot ему ничего не установлено.
а у LayoutRoot сам контрол

Код

<UserControl  
    mc:Ignorable="d"
    x:Class="GradientDescentWPF.GraphControl"
    x:Name="UserControl"
    d:DesignWidth="640" d:DesignHeight="480" Width="200" Height="200">
    <UserControl.Resources>
        <ControlTemplate x:Key="GraphButtonStyle" TargetType="{x:Type Button}">
            <Grid Width="Auto" Height="Auto"/>
        </ControlTemplate>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">
        <Grid Margin="8,8,8,8" x:Name="graphicOutput" SnapsToDevicePixels="true" Background="#FFDFD3D3" MouseLeftButtonUp="gridtest_MouseLeftButtonUp" LayoutUpdated="graphicOutput_LayoutUpdated"/>
    </Grid>
</UserControl>


SnapsToDevicePixels="true" пробовал поставить всему контролу.



Автор: tol05 20.11.2009, 13:51
1. Я попробовал каким-то образом порисовать сетки - размытия не вижу.
2. Непонятно, что зто за кривые линии на Вашем скриншоте, каким образом они прорисовываются. 

Одним словом - ответа у меня нет.

Если есть время - может быть имеет смысл попробовать нарисовать сетку не через Shapes, а через  Drawing? http://social.msdn.microsoft.com/forums/en-US/wpf/thread/116c4801-895a-43bb-8974-086109965bdb/ неплохое обсуждение 

Автор: Partizan 20.11.2009, 15:26
Цитата(tol05 @ 20.11.2009,  11:38)
Цитата(Partizan @  20.11.2009,  08:47 Найти цитируемый пост)
SnapsToDevicePixels обычно помогает преодолеть такую вот "размытость" smile

Цитата(jenik15 @  19.11.2009,  22:46 Найти цитируемый пост)
SnapsToDevicePixels усановлен в true


а теперь вопрос )
Код

this.graphicOutput.Children.Add(lineToAdd);

что такое graphicOutput и кто его родители? Вообще как выглядит VisualTree до этого элемента?

Виноват....по диагонали прочёл...

Автор: jenik15 21.11.2009, 01:55
линия и сетка рисуются в примере кода:
  
Код

                   foreach(var line in processor.ShowGrid())
                    {
                          Wpf.Line lineToAdd = new System.Windows.Shapes.Line();
                        lineToAdd.X1 = line.Point1.X;
                        lineToAdd.X2 = line.Point2.X;
                        lineToAdd.Y1 = line.Point1.Y;
                        lineToAdd.Y2 = line.Point2.Y;
                        lineToAdd.Stroke = System.Windows.Media.Brushes.Black;
                        lineToAdd.StrokeThickness = 1;
                       
                        this.graphicOutput.Children.Add(lineToAdd);
                    }
                    foreach (var line in lines)
                    {
                        Wpf.Line lineToAdd = new System.Windows.Shapes.Line();
                        lineToAdd.X1 = line.Point1.X;
                        lineToAdd.X2 = line.Point2.X;
                        lineToAdd.Y1 = line.Point1.Y;
                        lineToAdd.Y2 = line.Point2.Y;
                        lineToAdd.Stroke = System.Windows.Media.Brushes.Black;
                        lineToAdd.StrokeThickness = 1;
                        this.graphicOutput.Children.Add(lineToAdd);
                    }


первый сетка, а второй кривая линия, она просто состоит из других линий.

Автор: math64 21.11.2009, 10:52
Кривую лучше рисовать полилайном - соединения будут красивее и можно настроить их тип.
Сетку рисую так, никаких размытостей не замечал:
Код

    protected override void OnRender(DrawingContext dc)
    {
      dc.DrawRectangle(Brushes.Transparent, null, new Rect(RenderSize));
      var pen = new Pen(Brushes.Gray, 1);
      if (ShowGrid)
      {
        double gridStep = GridSize.Height;
        for (int i = 0; ; i++)
        {
          double y = i * gridStep;
          if (y > RenderSize.Height)
            break;
          dc.DrawLine(pen, new Point(0, y), new Point(RenderSize.Width, y));
        }
        gridStep = GridSize.Width;
        for (int i = 0; ; i++)
        {
          double x = i * gridStep;
          if (x > RenderSize.Width)
            break;
          dc.DrawLine(pen, new Point(x, 0), new Point(x, RenderSize.Height));
        }
      }
    }

Автор: jenik15 23.11.2009, 23:11
Cпасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)