سؤال

ولدي مشكلة تقديم غريبة عندما أحاول أن استخدام الرسومات المصقولة في برنامج الأغذية العالمي.

وهنا نسخة مبسطة.

إذا كنت تستخدم XAML التالي

<Window x:Class="RenderingBug.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Width="300" Height="300">
    <Grid Name="myGrid" Background="AntiqueWhite" Width="250" Height="250">
        <ScrollViewer Name="myScrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <Canvas Height="500" Width="500" Name="myCanvas" />
        </ScrollViewer>        
    </Grid>
 </Window>

وخدمات العملاء التالية

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace RenderingBug
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            PathFigureCollection pfc = new PathFigureCollection();
            PathFigure pf = new PathFigure();
            pf.StartPoint = new Point(100, 20);
            LineSegment ls = new LineSegment();
            ls.Point = new Point(20, 100);
            PathSegmentCollection psc = new PathSegmentCollection();
            psc.Add(ls);
            pf.Segments = psc;
            pfc.Add(pf);
            PathGeometry pg = new PathGeometry(pfc);

            RectangleGeometry clippingRectangle = new RectangleGeometry(new Rect(0, 0, 80, 80));

            Path p1 = new Path();
            p1.ClipToBounds = true;
            p1.Clip = clippingRectangle;
            p1.StrokeDashCap = PenLineCap.Square;
            p1.Stroke = Brushes.Black;
            p1.StrokeThickness = 30;
            p1.Data = pg;
            myCanvas.Children.Add(p1);

            Path p2 = new Path();
            p2.ClipToBounds = true;
            p2.Clip = clippingRectangle;
            p2.StrokeDashCap = PenLineCap.Square;
            p2.Stroke = Brushes.White;
            p2.StrokeThickness = 10;
            p2.Data = pg;
            myCanvas.Children.Add(p2);
        }
    }
}

وأحصل على مسألة تقديم غريبة مع تنعيم حيث زراعة المحاصيل حافة المستطيل هو (تشغيل البرنامج، وسوف يكون واضحا إلى حد ما، لكنه خط رمادي ضبابي حيث المستطيل الاقتصاص واقتطاع مسارات).

ولقد حاولت تقنيات مختلفة مثل محاذاة ضوابط لبكسل محددة، ووضع SnapsToDevicePixels على مختلف الضوابط على أمل أن هذا من شأنه أن يحل هذه المسألة (إزالة الفرقة رمادية ضبابية إضافية)، ولكن لا شيء يبدو للمساعدة.

وأي أفكار؟

هل كانت مفيدة؟

المحلول

وتبين أن هذا هو أنه على الرغم من النافذة هو، بطبيعة الحال، محاذاة على boundry بكسل، قد لا تكون الشبكة ضمن إطار. تحديد هذا ليس من الصعب بشكل مفرط، ولكن يمكن أن يستغرق بعض الوقت لمعرفة ما يجب القيام به.

وهناك دعا SnapsToDevicePixels التي يجب ان تحصل على كل شيء محاذاة بشكل صحيح ميزة لطيفة. و، للأسف، لأي سبب كان، فإنه لا يبدو قادرا على العمل على الإطلاق (يبدو أن هذا علة يفهم). لذا ماذا تفعل؟

أولا، يجب أن تكون محاذاة الشبكة في boundry بكسل (أي لا تركز، أو شيء من هذا القبيل لأنه إذا نافذة له عدد فردي من بكسل سواء في الاتجاه الأفقي أو الرأسي ثم الشبكة، وبالتالي محتويات الشبكة، سيتم المنحرفة.)

ولكن بعد ذلك، هناك قضايا أخرى للتعامل مع ... بمجرد البدء في التمرير أشرطة التمرير، وقطعة أثرية يظهر! وذلك لأن التمرير لا التمرير بالضرورة مضمون على عدد صحيح من وحدات البكسل. للتعامل مع ذلك، أنا التقاط بعض الأحداث في ScrollViewer لتعيين موقع التمرير إلى قيم الأعداد الصحيحة.

private void workingAreaScrollViewer_SizeChanged(object sender, SizeChangedEventArgs e)
{
    double w = e.NewSize.Width;
    double h = e.NewSize.Height;
    workingAreaScrollViewer.Width = Math.Round(w);
    workingAreaScrollViewer.Height = Math.Round(h);
}

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.A)
    {
        workingAreaCanvas.Children.Remove(p2);
    }
    if (e.Key == Key.Z && p2.Parent != workingAreaCanvas)
    {
        workingAreaCanvas.Children.Add(p2);
    }
}

ونفعل ذلك، ويبدو كل شيء على ما يرام.

و(كملاحظة جانبية، للأشخاص الذين يعانون من مشاكل صورة داخل ScrollViews ... إذا كنت تقوم بتشغيل في نفس القضية، وهذا ينبغي إصلاح ذلك أيضا، ما دام لا تحجيم الصور، استدارة، الخ ... طالما كنت مجرد محاولة لمحاذاة الصورة إلى boundry بكسل، وهذا ينبغي القيام بهذه المهمة.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top