如何在 SilverLight 中组合一些 UserControl?
也许这是一个简单的问题,但我找不到答案。 我有三个用户控件,仅颜色不同。其中有代码之一:
<UserControl x:Class="SilverlightApplication14.NodePicture"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SilverlightApplication14">
<UserControl.Resources>
<local:NodeViewModel x:Key="Children" />
</UserControl.Resources>
<Grid x:Name="LayoutRootNodePicture" Height="100" Width="100"
HorizontalAlignment="Center" DataContext="{Binding Source={StaticResource Children}, Path=Children}" >
<Canvas x:Name="ParentCanvas" Background="White" Width="100" Height="100" >
<Rectangle Fill="Yellow" Stroke="Blue" Width="100" Height="100" >
</Rectangle >
</Canvas>
<Image HorizontalAlignment="Center"
Source="add.png"
Stretch="Fill"
Width="16"
VerticalAlignment="Top"
Margin="0,0,2,2"
Height="16" MouseLeftButtonDown="Image_MouseLeftButtonDown">
</Image>
</Grid>
</UserControl>
如何将它们组合到 ObservableCollection Children 中?
public class NodeViewModel : INotifyPropertyChanged
{
public ObservableCollection<NodeViewModel> Children
{
get { return _children; }
set
{
_children = value;
NotifyChange("Children");
}
}
private void NotifyChange(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
我如何使用此控件集合的元素?
是否有一种简单(或正确的方法)的方法来做到这一点?
Maybe it is a simple question, but I can’t find the answer.
I have three User controls that are different only with colour. There is code one of them:
<UserControl x:Class="SilverlightApplication14.NodePicture"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SilverlightApplication14">
<UserControl.Resources>
<local:NodeViewModel x:Key="Children" />
</UserControl.Resources>
<Grid x:Name="LayoutRootNodePicture" Height="100" Width="100"
HorizontalAlignment="Center" DataContext="{Binding Source={StaticResource Children}, Path=Children}" >
<Canvas x:Name="ParentCanvas" Background="White" Width="100" Height="100" >
<Rectangle Fill="Yellow" Stroke="Blue" Width="100" Height="100" >
</Rectangle >
</Canvas>
<Image HorizontalAlignment="Center"
Source="add.png"
Stretch="Fill"
Width="16"
VerticalAlignment="Top"
Margin="0,0,2,2"
Height="16" MouseLeftButtonDown="Image_MouseLeftButtonDown">
</Image>
</Grid>
</UserControl>
How can I combine them into ObservableCollection Children?
public class NodeViewModel : INotifyPropertyChanged
{
public ObservableCollection<NodeViewModel> Children
{
get { return _children; }
set
{
_children = value;
NotifyChange("Children");
}
}
private void NotifyChange(string propName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
And how can I use then elements of this controls collection?
Is there a simple (or a right way ) way of doing this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
据我的理解,您有 3 个用户控件,其名称类似于 NodePicture、GreenNodePicture 和 BlueNodePicture。
首先,如果 3 个控件的差异很小,那么最好只有一个控件使用某些属性值来切换颜色。
假设您的控件因画布上矩形的背景颜色而异。因此,我将更改您的控件:
我删除了
Resources
部分,因为视图不应该创建新的视图模型对象,它应该使用现有的 DataContext。您可以看到矩形的背景颜色基于视图模型的属性NodeColor
。让我们将此属性添加到视图模型中:
现在,如果您想显示 3 个具有不同颜色的控件,您应该创建 3 个具有不同属性的视图模型。以下是红色、蓝色和绿色视图模型的示例:
使用数据模板将视图模型转换为视图:
我没有使用 Children 属性,因为我不知道在哪里使用它。也许子节点显示在画布上。无论如何,如果它很重要 - 您可以提供其他信息,我会提供帮助。
更新:
在画布上绘制子项的最简单方法是添加依赖属性,该属性会在集合更新时更新画布:
其中 TopOffset 和 LeftOffset 是 NodeViewModel 类的属性。
之后,您应该在 xaml 代码中设置此属性:
它不适用于
ObservableColelction
类,因为我没有处理CollectionChanged
事件。另一种方法 - 将
ListBox
控件与自定义ItemsPanelTemplate
和ListBoxItem ControlTemplate
结合使用。但这是更为复杂的解决方案。As far as I understood you right, you have 3 user controls which have names something like NodePicture, GreenNodePicture and BlueNodePicture.
First of all, if the 3 controls differ to a very little degree, it would be better to have only one control which switches the color using some property value.
Let's suppose that your controls differ by the background color of the rectangle on the canvas. So I would change your control so:
I've removed the
Resources
section because the view shouldn't create new view model objects, it should use an existing DataContext. You can see that the background color of the rectangle is based on the propertyNodeColor
of the view model.Let's add this property to the view model:
And now if you want to display 3 controls with different color you should create 3 view models with different properties. Here is the example of the red, blue and green viewmodels:
View models are translated into the views using data templates:
I haven't used the Children property because I haven't understood where to use it. Maybe child nodes are displayed on the canvas. Anyway if it is important - you can provide additional information and I'll help with this.
Update:
The easiest way to draw child items on the canvas is to add the dependency property which updates the canvas when the collection is updated:
Where the TopOffset and LeftOffset are the properties of the NodeViewModel class.
After that you should set this property in the xaml code:
It won't work with the
ObservableColelction
class because i didn't handle theCollectionChanged
event.Another approach - to use the
ListBox
control with the customItemsPanelTemplate
andListBoxItem ControlTemplate
. But it is the much more complex solution.