将基类中的元素放置在实现中的不同位置

本文关键字:实现 位置 基类 元素 | 更新日期: 2023-09-27 18:28:10

我在SO上看到了几个不同的页面,讨论我想要的东西,但我认为我的情况已经足够不同,可以在这里提出一个新的问题。所以我有一个没有XAML的基类。

public abstract class AbstractConfigWindow : System.Windows.Window
{
    public AbstractConfigWindow()
    {
        this.WindowState = System.Windows.WindowState.Maximized;
        this.WindowStyle = System.Windows.WindowStyle.None;
        this.SetResourceReference(System.Windows.Window.BackgroundProperty, "formBackground");
    }
    private bool locked = false;
    public bool Locked
    {
        get { return locked; }
        set { locked = value; }
    }
}

我创建了一个3个UserControls。它们有一个计算机的背景图像和4个常见按钮(与问题无关,只是细节)。

我有两个扩展AbstractConfigWindow的窗口。一个用于横向视图,另一个用于纵向视图。(不确定这是否是最好的方法,但它对我有效)我将这3个UserControls分别放在2个ChildWindow类中。由于这两个Windows都只是简单的Windows,所以这不是问题。既然我有了这个基类,我想把所有常见的东西(比如Window状态、样式背景等)都放在基类中。这将包括3个用户控件(随着这个程序越来越大,将添加更多的用户控件)。我的第一个想法是通过编程将新实例添加到Grid中。。然后把网格放在两个窗口中我需要的地方。我讨厌它有多脆弱。这是两个窗口中的一个窗口的外观的一个小示例。

<local:AbstractConfigWindow x:Class="UnitLibrary_WPF.ConfigureWindowLandscape"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:UnitLibrary_WPF"
        xmlns:b="clr-namespace:UnitLibrary_WPF.Buttons"
        xmlns:u="clr-namespace:UnitLibrary_WPF.UnitImagePanels"
        xmlns:s="clr-namespace:UnitLibrary_WPF.Storyboards"
        Width="800"
        Height="480">
    <local:AbstractConfigWindow.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </local:AbstractConfigWindow.Resources>
    <Viewbox Margin="10">
        <DockPanel x:Name="mainView"
                   Height="480"
                   Width="800">
            <local:uHeader DockPanel.Dock="Top" />
            <local:uBrightnessControl DockPanel.Dock="Top" Height="75" />
            <local:uOposButtons Margin="0,5,0,0" DockPanel.Dock="Right" />
            <Grid Margin="10">
                <Viewbox x:Name="u8800viewbox"
                         Visibility="Hidden">
                    <u:u8800Image />
                </Viewbox>
                <Viewbox x:Name="u9000viewbox"
                         Visibility="Hidden">
                    <u:u9000Image />
                </Viewbox>
                <Viewbox x:Name="u7200viewbox"
                         Visibility="Hidden">
                    <u:u7200Image>
                        <u:u7200Image.LayoutTransform>
                            <TransformGroup>
                                <ScaleTransform />
                                <SkewTransform />
                                <RotateTransform Angle="90" />
                                <TranslateTransform />
                            </TransformGroup>
                        </u:u7200Image.LayoutTransform>
                    </u:u7200Image>
                </Viewbox>
            </Grid>
        </DockPanel>
    </Viewbox>
</local:AbstractConfigWindow>

在另一个窗口中,我不旋转u7200Image(这是我前面提到的3个UserControls之一)。

所以问题是,我如何将这些3+控件添加到基类中,这样我只需要将它们添加到基类而不是每个子类中?

将基类中的元素放置在实现中的不同位置

为什么不在DataTemplate:中创建3个控件

<DataTemplate DataType="{x:Type ViewModels:YourViewModel}">
    <!--Your 3 controls-->
</DataTemplate>

然后,在每个窗口中,您只需要添加一个数据类型的实例和一个ContentControl,3个控件就会神奇地出现。

<Window.Resources>
    <ViewModels:YourViewModel x:Key="InstanceOfYourDataType" />
</Window.Resources>
<ContentControl Content="{Binding Source={StaticResource InstanceOfYourDataType}}" />