处理WPF Canvas正确/有效地调整大小

我附上工作代码。 我的问题:我是否正确/有效地处理调整大小? 我在画布中心的WPF Canvas Circle和Canvas中心的垂直和水平线上画一个场景。 当我调整画布大小时,清除所有子项并根据新的“画布大小”重新绘制整个场景。 有没有更好的方式来做这个说RenderTransform等? 仅供参考我真正的应用比这个简单的例子更复杂,我只是想发布这个代码,因为它演示了最短的代码来演示我尝试的真正的优化。

XAML:

    <Window x:Class="Sample2.MainWindow"
        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:Sample2"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="400"  SizeChanged="Window_SizeChanged">
    <Grid>
        <Canvas x:Name="MainCanvas">

        </Canvas>
    </Grid>
</Window>

代码隐藏:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 Sample2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void DrawScene()
        {
             MainCanvas.Children.Clear();

            double ctrX = MainCanvas.ActualWidth    / 2;
            double ctrY = MainCanvas.ActualHeight   / 2;

            Ellipse elps = new Ellipse();
            elps.Width = elps.Height = 100;
            elps.Stroke = Brushes.Red;
            MainCanvas.Children.Add(elps);
            Canvas.SetLeft(elps, ctrX-elps.Width/2);
            Canvas.SetTop(elps,  ctrY-elps.Height/2);

            Line lnVertical   = new Line();
            lnVertical.Stroke = Brushes.Blue;
            lnVertical.X1 = lnVertical.X2 = ctrX;
            lnVertical.Y1 = 0;
            lnVertical.Y2 = MainCanvas.ActualHeight;
            MainCanvas.Children.Add(lnVertical);

            Line lnHorizontal   = new Line();
            lnHorizontal.Stroke = Brushes.Red;
            lnHorizontal.X1 = 0;
            lnHorizontal.X2 = MainCanvas.ActualWidth;
            lnHorizontal.Y1 = lnHorizontal.Y2 = ctrY;
            MainCanvas.Children.Add(lnHorizontal);
        }
        //private void Window_Loaded(object sender, RoutedEventArgs e)
        //{

        //}

        private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            DrawScene();
        }
    }
}

我的实际应用程序是数据驱动的,看起来像这样。 唯一真正的数据驱动元素是(颜色/类型)和井管中的深度:圆圈位置是在VM中计算出来的位置,以避免重叠 在这里输入图像描述


我通过与朋友交谈发现了这个问题的最终答案。 克莱门斯就在附近,可能为这个问题创建了一个非常有效的答案,如果我能够使用单笔画颜色。 resize事件在我的应用程序no中处理,每个子框架元素都有一个简单的Invalidate。

  SizeChanged += (s, e) =>
        {

            WellCanvas.SetCoordinateSystem(wm.OverallStartDepth,
                                            wm.OverallEndDepth,

                                            wm.OverallEndDepth,
                                            wm.OverallStartDepth);
            **// This seemed to solve the problem**
            foreach (FrameworkElement elem in WellCanvas.Children)
                elem.InvalidateVisual();

        };
链接地址: http://www.djcxy.com/p/53311.html

上一篇: Handling WPF Canvas Resize Correctly/Efficiently

下一篇: How to position labels around circle?