画布声明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可以变成画布,为什么还要保留画布呢?
您可以构建一个ImageBoard
UserControl
:
<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
的代码中抽象出来的,这是封装。