【发布时间】:2019-03-02 22:32:59
【问题描述】:
和主题一样,我想动态添加相同模板但不同数据的 WPF 控件。
如图所示,我要复制的控件有些复杂。整个控件被包裹在Canvas 内ScrollViewer 内。
每个StackPanel 包装TextBlock 和another Canvas Control,而这个StackPanel 是我想要重现的。
代码如下:
<ScrollViewer x:Name="ScrollBoard" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
<Canvas x:Name="CanvasBoard" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Height="250" Background="Gray">
<StackPanel x:Name="CanvasStack" Background="DimGray">
<CheckBox />
<Border x:Name="CanvasBorder" BorderBrush="Black" BorderThickness="1">
<Canvas Width="150" Height="200" ClipToBounds="True">
<Image x:Name="CanvasImage" Canvas.Left="0" Canvas.Top="0" Stretch="Fill" Source="C:\test.jpg"/>
</Canvas>
</Border>
<TextBlock Text="Test.jpg" />
</StackPanel>
</Canvas>
</ScrollViewer>
我想在 CanvasBoard Canvas 控件中复制 CanvasStack StackPanel 控件。
当然,不只是复制,还想控制它。
比如改变位置,编辑TextBlock文字,替换Image并获取点击事件等等。
另外,我不会使用ListBox 或ListView,因为每个控件都应该位于具有不同大小的绝对x、y 坐标中。
有一些示例可以执行类似的操作,例如“向某个控件添加按钮”。但是我发现只是在后端添加了带有硬编码属性的控件,这可能不适合这种复杂的控件。
提前谢谢你。
【问题讨论】:
-
您应该将其创建为用户控件并查看stackoverflow.com/questions/1093429/… 以在 xaml 中使用它
-
@ViníciusGabriel 我应该为此使用自定义用户控件吗?如果可能的话,如果可能的话,我想亲自避免它。但如果那是体面的方式,是的,我必须遵循它。
-
如果你想避免它,那么试试:stackoverflow.com/a/27188799/10008842。如果你成功了,别忘了加上 x:Shared="False" 和 x:Key="yourKey"。
-
为什么要避免制作自己的用户控件?控件和类通常提供封装和关注点分离,使您的代码更整洁、更易于理解,尤其是在您的情况下,更易于重用。
标签: c# wpf vb.net visual-studio controls