2013-08-19 34 views
1

我在这里看到了几个不同的页面,讨论我在做什么之后,但我认为我的案例不同,足以提出一个新的问题。所以我有一个没有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个常用按钮(与问题无关,只是细节)。

我有2个扩展AbstractConfigWindow的Windows。一个是横向视图,另一个是纵向。 (不知道这是否是最好的方法,但它适用于我)我将这3个用户控件放置在两个子窗口类的每一个中。因为有一次这两个Windows都只是简单的Windows,这不是问题。那么现在我有了这个基类,我想把所有常见的东西(如窗口状态,样式背景..等等)放在基类中。这将包括3个用户控件(当程序变得更大时,会添加更多的控件)我的第一个想法是以编程方式将新的实例添加到Grid ..然后,只需将该网格放置在我需要的每个2个窗户。我讨厌它有多脆弱。这是两个窗口中的一个的一个小例子。

<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个用户控件之一)。

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

+0

作为供参考这篇文章是非常接近我想要的。 http://stackoverflow.com/q/11140000/1329396但我必须能够移动它。我想我通过创建类文件而不是Window文件来犯错误...... –

+0

你是说RotateTransform是ConfigureWindowLandscape和ConfigureWindowPortrait之间的* only *区别吗?你为什么不为该轮换创建一个属性? – Clemens

+0

@Clemens还有一些其他的美学变化。例如:u:POS按钮从停靠到右侧,进入“Expander”和Dock Top。我们也希望将其添加到基类中,但一次只能做到这一点。虽然你对旋转属性的建议是一个好主意,但应该停留在那个Usercontrol需要的4个按钮仍然朝下,而不是与控件一起旋转。 –

回答

1

你为什么不只是建立在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}}" />