2015-06-19 5 views
0

Я только что создал приложение Windows Form для наследования элементов управления из базовой формы и отлично работает.Создание общей структуры (темы) в окне WPF

В WPF XAML можно ли наследовать элементы управления от базовой формы до другой, как указано выше?

Когда я попытался в визуальной студии, у меня появилась ошибка: «parentchild.MainWindow» не может быть корнем файла XAML, поскольку он был определен с помощью XAML ».

Мои Basewindow CS код:

namespace parentchild 
    { 
    public partial class BaseWindow : Window 
     { 
      public BaseWindow() 
      { 
       InitializeComponent(); 
      } 
     } 
} 

Мой Basewindow XAML код:

<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:dxr="http://schemas.devexpress.com/winfx/2008/xaml/ribbon" x:Class="parentchild.BaseWindow" 
     Title="BaseWindow" Height="350" Width="525"> 
    <Grid> 
     <StatusBar HorizontalAlignment="Left" Height="35" Margin="0,285,0,0" VerticalAlignment="Top" Width="517"> 
      <Label Content="Label"/> 
      <Label Content="Label"/> 
     </StatusBar> 
    </Grid> 
</Window> 

Мой childwindow CS код:

namespace parentchild 
{ 
    public partial class childwindow : BaseWindow 
    { 
     public childwindow() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

Мой childwindow XAML код:

<mn:BaseWindow x:Class="parentchild.childwindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mn="clr-namespace:parentchild" 
      Title="childwindow" Height="300" Width="300"> 
     <Grid> 

     </Grid> 
    </mn:BaseWindow> 

Я нашел другое решение, создав пользовательский элемент управления и применив его ко всем окнам. Правильно ли это?

У любого есть решение для создания общей темы/структуры для всех окон Xaml.

Просьба предоставить мне решение для решения этой проблемы.

+0

Это может помочь - http://stackoverflow.com/a/7508090/442444 – CarbineCoder

+0

Возможный дубликат [MyUserControl не может быть корнем файла XAML, поскольку он был определен с помощью XAML] (http://stackoverflow.com/ вопросы/10873008/myusercontrol-не может-быть-в-корень-из-а-XAML-файл, потому что-это был определенный, используя-XAM) – Sinatr

ответ

1

Вы не можете наследовать от класса, определенного в xaml. Я, вероятно, займусь созданием UserControl и использую это как «базовый контейнер» в любом Окне, в котором вы хотите иметь строку состояния. Если вы намерены сделать базовое окно, вы можете попробовать что-то вроде этого:

Определение базового окна в коде только:

public class MyWindowBase : Window 
    { 
     private ContentControl contentControl; 

     public MyWindowBase() 
     { 
      this.CreateContent(); 
     } 

     public Object BaseContent 
     { 
      get { return this.contentControl.Content; } 
      set { this.contentControl.Content = value; } 
     } 

     private void CreateContent() 
     { 
      var grid = new Grid(); 
      var row1 = new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) }; 
      var row2 = new RowDefinition() { Height = GridLength.Auto }; 
      grid.RowDefinitions.Add(row1); 
      grid.RowDefinitions.Add(row2); 

      var statusBar = new StatusBar() { Height = 35, Background = Brushes.Blue }; // Initialize the status bar how you want. 
      Grid.SetRow(statusBar, 1); 

      this.contentControl = new ContentControl(); 

      grid.Children.Add(this.contentControl); 
      grid.Children.Add(statusBar); 

      base.Content = grid; 
     } 
    } 

Используйте базовое окно в XAML как это:

<WpfApplication7:MyWindowBase xmlns:WpfApplication7="clr-namespace:WpfApplication7" x:Class="WpfApplication7.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="500"> 
    <WpfApplication7:MyWindowBase.BaseContent> 
     <Button> 
      Something 
     </Button> 
    </WpfApplication7:MyWindowBase.BaseContent>  
</WpfApplication7:MyWindowBase> 

Конечно, базовый класс имеет возможность для улучшения, например, сделать свойство BaseContent зависимым, но я думаю, что это демонстрирует основную идею.

0

Похоже, вы в основном пытаетесь создать настраиваемый элемент управления, который расширяет Window. Создание пользовательских элементов управления в WPF является сложной темой, потому что при принятии решения о ее реализации есть что немало. Посмотрите на эту статью, которая говорит об этом:

Control Authoring Overview

Скорее всего, вы на самом деле не хотите пользовательский элемент управления, а обычай ControlTemplate (автор в XAML), который переопределяет как вы хотите, чтобы ваше окно смотреть. Вы можете определить шаблон в Style и применить этот стиль к любому Window, который вы хотите. В ответе очень много объяснений, поэтому вы должны прочитать, как работают шаблоны управления и как они полезны.

Если вы решите, что вам нужно добавить новые свойства в свое пользовательское окно, вам нужно создать новый класс, который расширяет Window и добавляет эти свойства как dependency properties (теперь у вас есть настраиваемый элемент управления).Затем вы можете использовать эти свойства в своем обычном ControlTemplate, чтобы делать все, что вы хотите от них.

Работа в WPF совсем не похожа на работу в Windows Forms. Если вы попытаетесь применить методы и методы, которые вы изучили в Windows Forms в приложении WPF, вы столкнетесь с множеством головных болей. Я сделал этот переход пару лет назад, и мой совет - не делать никаких предположений о WPF на основе того, что вы знаете из Windows Forms. Это совершенно разные системы с разными способами.

Смежные вопросы