在WPF中向窗口添加Canvas的派生类时遇到问题

本文关键字:派生 遇到 问题 Canvas WPF 窗口 添加 | 更新日期: 2023-09-27 18:07:01

我是WPF的新手,我正在阅读Pro WPF c# 2010这本书。我想创建一个自定义派生类的画布,然后将其添加到主窗口,但我不能将其添加到主窗口。

我所做的是我已经创建了一个名为DrawingCanvas的新类(添加了DrawingCanvas.c#文件),并像这样声明它:

类定义:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media;
using System.Windows.Controls;
namespace CustomDrawingCanvas 
{
    public class DrawingCanvas : Canvas
    {
        private List<Visual> visuals = new List<Visual>();
        protected override int VisualChildrenCount
        {
            get
            {
                return visuals.Count;
            }
        }
        protected override Visual GetVisualChild(int index)
       {
            return visuals[index];
        }
        public void AddVisual(Visual visual)
        {
            visuals.Add(visual);
            base.AddVisualChild(visual);
            base.AddLogicalChild(visual);
        }
        public void DeleteVisual(Visual visual)
        {
            visuals.Remove(visual);
            base.RemoveVisualChild(visual);
            base.RemoveLogicalChild(visual);
        }
    }
}

但是当我尝试添加它时(按照书中给出的XAML,它没有给出关于在主窗口的XAML文件中放置XAML的任何信息)使用这个XAML:

<local:DrawingCanvas x:Name="drawingSurface" Background="White" ClipToBounds="True"
MouseLeftButtonDown="drawingSurface_MouseLeftButtonDown"
MouseLeftButtonUp="drawingSurface_MouseLeftButtonUp"
MouseMove="drawingSurface_MouseMove" />

给出错误"local是一个未声明的前缀"。当我把鼠标悬停在

我已经添加了一个像这样的堆栈面板:

<Window x:Class="CustomDrawingCanvas.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Name="spanel">
            <local:DrawingCanvas x:Name="drawingSurface" Background="White" ClipToBounds="True"
                MouseLeftButtonDown="drawingSurface_MouseLeftButtonDown"
                MouseLeftButtonUp="drawingSurface_MouseLeftButtonUp"
                MouseMove="drawingSurface_MouseMove" />
        </StackPanel>
    </Grid>
</Window>

我做错了什么

,我也试图添加一个实例的DrawingCanvas使用这样的代码:

public void AddDrawingSurface()
    {
        drawingSurface = new DrawingCanvas();
        drawingSurface.Background = new SolidColorBrush(Colors.AliceBlue);
        drawingSurface.ClipToBounds = true;
        Button button = new Button();
        button.Content = "A button";
        //spanel.Children.Add(button);
        spanel.Children.Add(drawingSurface);
    }

在InitializeComponent()之后调用这个函数

按钮被添加,但没有堆栈面板。请解释一下我缺少的东西是什么,我试过谷歌,并找到了许多通过代码添加自定义元素的方法,该方法通常是相同的,适用于其他元素,但不适用于DrawingCanvas: Canvas类。

在WPF中向窗口添加Canvas的派生类时遇到问题

你需要在你的Windows类头文件中声明你的本地别名,即

<Window x:Class="CustomDrawingCanvas.MainWindow"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
xmlns:local="The namespace of your custom control here"
Title="MainWindow" Height="350" Width="525">