画布声明xaml

本文关键字:xaml 声明 布声明 | 更新日期: 2023-09-27 18:17:15

是否可以在xaml中声明画布,而不需要在MainWindow.xaml.cs页面中声明画布?

我已经创建了一个名为ImageBoard的类,但我需要这个类将xaml画布保存在本地-而不是在Mainwindow.xaml.cs中。我想要的是ImageBoard作为这个画布的管理器。

我能想到的唯一另一种方法是让ImageBoard从Canvas本身派生,这样它就是画布。然后我可以把它放到主窗口

现在我有这个。

Xaml:

<Canvas HorizontalAlignment="Center" Height="370" VerticalAlignment="Center" Width="688"
  x:Name="canvas1" Background="#f6f6f6"/>

但是它只能从主窗口调用,因为它是主窗口的一部分。因此,我必须将它传递给ImageBoard来执行各种方法。

我认为最好是这样

Public class ImageBoard : Canvas

,这将消除传递画布的需要。

我确实试图声明对画布的引用,通过ImageBoard的构造函数,但我认为这将是不好的做法;因为我基本上是用ImageBoard来画画的。既然ImageBoard可以变成画布,为什么还要保留画布呢?

画布声明xaml

您可以构建一个ImageBoard UserControl:

XAML:

<UserControl x:Class="WpfMagic.ImageBoard"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Canvas x:Name="canvas" Background="Transparent" MouseLeftButtonUp="Canvas_MouseLeftButtonUp"></Canvas>    
    </Grid>
</UserControl>

背后的代码:

using System.Windows.Controls;
using System.Windows.Input;
namespace WpfMagic
{
    public partial class ImageBoard : UserControl
    {
        public ImageBoard()
        {
            InitializeComponent();
        }
        private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            TextBlock tb = new TextBlock { Text = "*", FontSize = 20 };
            tb.SetValue(Canvas.TopProperty, e.GetPosition(canvas).Y);
            tb.SetValue(Canvas.LeftProperty, e.GetPosition(canvas).X);
            canvas.Children.Add(tb);
        }
    }
}

从你的主页你可以做:

<Window x:Class="WpfMagic.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfMagic"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:ImageBoard></local:ImageBoard>
    </Grid>
</Window>

这样你就永远不会直接操作Canvas,它是从使用ImageBoard的代码中抽象出来的,这是封装