Возникли проблемы при добавлении производного класса Canvas к окну в WPF - PullRequest
2 голосов
/ 27 августа 2011

Я новичок в WPF и слежу за книгой Pro WPF C # 2010. Я хочу создать собственный производный класс canvas, а затем добавить его в главное окно, но не могу добавить его вГлавное окно.

Я создал новый класс 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 is notclared prefix».И когда я наведите курсор мыши на

, я добавил в панель стека вот так:

<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 ().

Кнопка добавляется, но не панель стека.Пожалуйста, объясните, что мне не хватает, я попытался найти в Google и нашел множество способов добавления пользовательских элементов с помощью кода, и этот метод, как правило, тот же, который работает для других элементов, но не для класса DrawingCanvas: Canvas.

1 Ответ

9 голосов
/ 27 августа 2011

Вам необходимо объявить свой локальный псевдоним в заголовке класса 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">  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...