自定义WPF / XAML画布 [英] Custom WPF/XAML Canvas
问题描述
我正在尝试创建和使用自定义画布。这是XAML(MyCanvas.xaml):
I'm trying to create and use a custom Canvas. Here is the XAML (MyCanvas.xaml):
<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:Core="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Namespace="clr-namespace:MyNamepace" xmlns:Properties="clr-namespace:MyNamepace.Properties" Core:Class="MyNamepace.MyCanvas">
<Canvas.Resources>
<Namespace:ImagesConverter Core:Key="ImagesConverter"/>
</Canvas.Resources>
<Image Source="{Binding Source={Core:Static Properties:Resources.Background}, Converter={StaticResource ImagesConverter}}" Stretch="Fill"/>
</Canvas>
这是代码声明(MyCanvas.xaml.cs):
Here is the code declaration (MyCanvas.xaml.cs):
public partial class MyCanvas : Canvas
当我尝试像这样使用它时:
When I try to use it like so:
<Namespace:MyCanvas Core:Name="Layout" Loaded="OnLoaded">
<Namespace:MyUserControl Core:Name="Control1" Namespace:MyCanvas.Left="50" MyProperty="50">
<Namespace:MyCanvas.Top>
<MultiBinding Converter="{StaticResource MathConverter}" ConverterParameter="(x - y) / 2">
<Binding ElementName="Layout" Path="ActualHeight"/>
<Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/>
</MultiBinding>
</Namespace:MyCanvas.Top>
</Namespace:MyUserControl>
<Namespace:MyUserControl Core:Name="Control2" Namespace:MyCanvas.Left="744" Namespace:MyCanvas.Top="42" MyProperty="150"/>
</Namespace:MyCanvas>
我遇到两个不同的错误:
I get two different errors:
内容属性只能设置一次。 ==>它不是继承Canvas吗?!?!?!
The property "Content" can only be set once. ==> Isn't it inheriting Canvas?!?!?!
成员 Top未被识别或无法访问。 ==>是不是再次继承了Canvas?!?!?!
成员 Left未被识别或无法访问。 ==>是不是再次继承了Canvas?!?!?!
The member "Top" is not recognized or is not accessible. ==> Isn't it inheriting Canvas again?!?!?! The member "Left" is not recognized or is not accessible. ==> Isn't it inheriting Canvas again?!?!?!
编辑:这就是我的意思远...仍在获取内容已设置错误!
MyCanvas.xaml
MyCanvas.xaml
<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:Core="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Namespace="clr-namespace:MyNamespace" xmlns:Properties="clr-namespace:MyNamespace.Properties" Core:Class="MyNamespace.MyCanvas">
<Canvas.Background>
<ImageBrush ImageSource="{Binding Source={Core:Static Properties:Resources.Background}, Converter={StaticResource ImagesConverter}}" Stretch="Fill"/>
</Canvas.Background>
<Canvas.Resources>
<Namespace:ImagesConverter Core:Key="ImagesConverter"/>
</Canvas.Resources>
</Canvas>
MyCanvas.xaml.cs
MyCanvas.xaml.cs
public class MyCanvas : Canvas
{
// ...
}
MainWindow.xaml
MainWindow.xaml
<Namespace:MyCanvas Core:Name="MyCanvas" Loaded="OnLoaded">
<Namespace:MyUserControl ...
<Namespace:MyUserControl ...
<Namespace:MyUserControl ...
</Namespace:MyCanvas>
推荐答案
左
和 Top
是附加属性。这意味着它们不会被您的类继承。
Left
and Top
are attached properties. That means that they are not inherited by your class.
您需要更改用户控件声明以使用 Canvas.Left
和 Canvas.Top
代替:
You need to change the user control declaration to use Canvas.Left
and Canvas.Top
instead:
<Namespace:MyUserControl Core:Name="Control2" Canvas.Left="744" Canvas.Top="42"
MyProperty="150"/>
内容的问题是您将其设置了两次,就像错误消息中说的那样。
The problem with the content is that you set it twice, just like the error message says.
- 在
MyCanvas.xaml
中,将其设置为Image
。 - 使用时,将其设置为用户控件。
- In
MyCanvas.xaml
you set it to anImage
. - When using it, you set it to your user controls.
要对其进行修复,您需要在 MyCanvas
中添加 ItemsControl
并将其声明为表示内容的控件:
To fix it, you need to add an ItemsControl
to MyCanvas
and declare it as the control that represents the content:
<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:Core="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Namespace="clr-namespace:MyNamepace" xmlns:Properties="clr-namespace:MyNamepace.Properties" Core:Class="MyNamepace.MyCanvas">
<Canvas.Resources>
<Namespace:ImagesConverter Core:Key="ImagesConverter"/>
</Canvas.Resources>
<Image Source="{Binding Source={Core:Static Properties:Resources.Background}, Converter={StaticResource ImagesConverter}}" Stretch="Fill"/>
<ItemsControl Content="{Binding Path=LocalContent, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Namespace:MyCanvas}}}" />
</Canvas>
在您的课程文件中:
[ContentProperty("LocalContent")]
public partial class MyCanvas : Canvas
{
public static readonly DependencyProperty LocalContentProperty =
DependencyProperty.Register(
"LocalContent",
typeof(UIElementCollection),
typeof(MyCanvas ),
new PropertyMetadata(default(UIElementCollection)));
}
这篇关于自定义WPF / XAML画布的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!