XAML 我应该如何构造我的WPF类来表示具有特定图标表示形式的通用图标类型?

llycmphe  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(199)

我有一个WPF应用程序,其中一个主要功能是"布局"窗口。在布局窗口中,用户可以放置/定位/调整LayoutElements的大小。
共享图标的放置/定位/调整大小行为;它们在鼠标拖动和调整大小方面的行为都是一样的。我已经实现了这个行为,它正在按我的意图工作。
我当前方法的一个问题是,我在主Canvas窗口中定义了DataTemplates,以告知XAML如何呈现各种LayoutElement子类,并且每个LayoutElement子类都有自己的XAML文件来定义其外观。
例如,在我的主绘图/画布XAML中,我有:

<DataTemplate x:Key="trackTemplate">
        <local:SizingOverlay MouseDown="IconMouseDown" MouseUp="IconMouseUp" MouseMove="IconMouseMove" MouseEnter="IconMouseEnter" MouseLeave="IconMouseExit">
            <local:Track Width="128" Height="128" Canvas.Left="0" Canvas.Top="0" />
        </local:SizingOverlay>
    </DataTemplate>

模板查找使用上面的语句表示:当你有一个TrackLayoutElement时,用这种方式呈现它。
此外,我还有Track.xaml,它定义了local:Track元素的外观。
如果我继续添加更多的LayoutElement类型,我将不得不继续添加更多的DataTemplate,基本上说:对于每种元素类型,请使用适当的XAML文件作为SizingOverlay的内容。
但是,似乎应该有一种方法告诉这个DataTemplate它包含LayoutElement,并且它应该使用包含的LayoutElement的具体子类来获取XAML。
换句话说就是:我有抽象类LayoutElement和该类的具体表示。我如何告诉WPF使用具体子类的XAML?
以下是我尝试过的方法:
如果我向LayoutElement添加一个XAML布局,Track.xaml就会抱怨,因为它是一个LayoutElement,并且与LayoutElement.xaml定义冲突。
如果我没有LayoutElement的XAML,那么我就不能做类似这样的事情:

<DataTemplate x:Key="trackTemplate">
        <local:SizingOverlay MouseDown="IconMouseDown" MouseUp="IconMouseUp" MouseMove="IconMouseMove" MouseEnter="IconMouseEnter" MouseLeave="IconMouseExit">
            <local:LayoutElement Width="128" Height="128" Canvas.Left="0" Canvas.Top="0" />
        </local:SizingOverlay>
    </DataTemplate>

编辑:可能重复
我承认此问题可能与以下问题重复:
How to create a common WPF base window style?
Abstract class on XAML-Window
Creating an abstract base class for windows in WPF
c# WPF XAML - Working with abstract UserControls
MyUserControl cannot be the root of a XAML file because it was defined using XAML
Inheriting from a UserControl in WPF
Using an Abstract Class as DataType in DataTemplates
然而,我不确定上面的问题是否包含了对我的用例的完整/适当的回答。它们包含了相当多的假设性讨论,回答说"我认为"这个,"也许"那个。
我相信我已经尝试了在其他链接中提出的解决方案(特别是最后一个),它编译,但具体类没有显示,好像它找不到具体类XAML,只是放弃了。
我将检查这些答案,如果它们明显适用于此问题,我将删除此问题。否则,我将使用新答案更新此问题(或者其他人可以)。

bgtovc5b

bgtovc5b1#

我能够通过将抽象类XAML元素替换为内容绑定到子类的ContentPresenter来使其工作。

<DataTemplate x:Key="elementTemplate" >
        <local:SizingOverlay MouseDown="IconMouseDown" MouseUp="IconMouseUp" MouseMove="IconMouseMove" MouseEnter="IconMouseEnter" MouseLeave="IconMouseExit">
            <ContentPresenter Content="{Binding}"/>
        </local:SizingOverlay>
    </DataTemplate>

相关问题