2009-11-26 65 views
11

我已經得到了很多用戶的控制是這樣的:重用XAML塊的最佳方式是什麼?

PageManageCustomers.xaml.cs:

public partial class PageManageCustomers : BasePage 
{ 
... 
} 

從繼承:

PageBase.cs:

public class BasePage : UserControl, INotifyPropertyChanged 
{ 
... 
} 

由於PageBase.c s沒有伴隨的XAML文件,我必須把它引用的XAML放在的每個的用戶控件中,例如繼承它的用戶控件。以下塊在重複一次繼承PageBase控制的每一個 XAML文件:

<DataTemplate x:Key="manageAreaCellTemplate"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Style="{DynamicResource ManageLinkStyle}" 
    Tag="{Binding Id}" Text="Delete" MouseDown="System_Delete_Click"/> 
     <TextBlock Text=" "/> 
     <TextBlock Style="{DynamicResource ManageLinkStyle}" 
      Tag="{Binding Id}" Text="Edit" MouseDown="System_Edit_Click"/> 
    </StackPanel> 
</DataTemplate> 

我試圖把這個塊成資源文件,但不能得到語法正確的,它說:

'的ResourceDictionary' 根元素 需要斧:類屬性 支持事件處理程序在XAML 文件。爲MouseDown事件移除事件處理程序 ,或者將x:Class屬性添加到根元素。

也許我可以與XamlReader'莫名其妙閱讀這些塊?

如何將此重複代碼塊放在一個位置,以便在每個繼承BagePage的XAML文件中不重複?

下面是此問題的一個可再現例如:

Window1.xaml:

<Window x:Class="TestXamlPage8283.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel x:Name="MainContent"/> 
</Window> 

Window1.xaml.cs:

using System.Windows; 

namespace TestXamlPage8283 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      Page1 page1 = new Page1(); 
      MainContent.Children.Add(page1); 

      Page2 page2 = new Page2(); 
      MainContent.Children.Add(page2); 
     } 
    } 
} 

的Page1.xaml :

<local:BasePage x:Class="TestXamlPage8283.Page1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TestXamlPage8283" 
    Height="40" Width="300"> 
    <StackPanel> 
     <TextBlock Text="{Binding PageTitle}" 
        FontSize="14" 
        FontWeight="Bold"/> 
     <TextBlock Text="This is XAML that is specific to page one." /> 
    </StackPanel> 
</local:BasePage> 

Page1.xaml.cs:

namespace TestXamlPage8283 
{ 
    public partial class Page1 : BasePage 
    { 
     public Page1() 
     { 
      InitializeComponent(); 
      PageTitle = "Page One"; 
     } 
    } 
} 

Page2.xaml:

<local:BasePage x:Class="TestXamlPage8283.Page2" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TestXamlPage8283" 
    Height="40" Width="300"> 
    <StackPanel> 
     <TextBlock Text="{Binding PageTitle}" 
        FontSize="14" 
        FontWeight="Bold"/> 
     <TextBlock Text="This is XAML that is specific to page two." /> 
    </StackPanel> 
</local:BasePage> 

Page2.xaml。CS:

namespace TestXamlPage8283 
{ 
    public partial class Page2 : BasePage 
    { 
     public Page2() 
     { 
      InitializeComponent(); 
      PageTitle = "Page Two"; 
     } 
    } 
} 

BasePage.cs:

using System.Windows.Controls; 
using System.ComponentModel; 

namespace TestXamlPage8283 
{ 
    public class BasePage : UserControl, INotifyPropertyChanged 
    { 
     #region ViewModelProperty: PageTitle 
     private string _pageTitle; 
     public string PageTitle 
     { 
      get 
      { 
       return _pageTitle; 
      } 

      set 
      { 
       _pageTitle = value; 
       OnPropertyChanged("PageTitle"); 
      } 
     } 
     #endregion 

     public BasePage() 
     { 
      DataContext = this; 
     } 

     #region INotifiedProperty Block 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
     #endregion 
    } 
} 

如何採取這個

<TextBlock Text="{Binding PageTitle}" 
      FontSize="14" 
      FontWeight="Bold"/> 

出Page1.xa的毫升和Page2.xaml並把它放在一個的地方,所以我可以參考來自Page1.xaml和Page2.xaml?(所以,當我想改變字號= 14〜字號= 16,我只需要改變它在一個地方)

+0

看來你問的是類似於Asp.net的主頁面。我不知道這是否可能。對於您的TextBlock最後一個示例(更改PageTitle文本塊的FontSize),是不是指什麼樣式? – 2009-11-26 18:05:56

回答

5

使用資源字典 - 一個MyDictionary.xaml文件添加到您的項目,並設置其生成操作「頁面「:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <DataTemplate x:Key="manageAreaCellTemplate"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Style="{DynamicResource ManageLinkStyle}" 
       Tag="{Binding Id}" Text="Delete" MouseDown="System_Delete_Click"/> 
      <TextBlock Text=" "/> 
      <TextBlock Style="{DynamicResource ManageLinkStyle}" 
       Tag="{Binding Id}" Text="Edit" MouseDown="System_Edit_Click"/> 
     </StackPanel> 
    </DataTemplate> 
</ResourceDictionary> 

然後在其他XAML文件,你是指它具有:

<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="MyDictionary.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 
    ... some other local resources ... 
</ResourceDictionary> 

,並請參閱您的資源作爲Template={StaticResource manageAreaCellTemplate}

+0

當我這樣做的時候它會告訴我:''ResourceDictionary'根元素需要ax:Class屬性來支持XAML文件中的事件處理程序,或者移除MouseDown事件的事件處理程序,或者將ax:Class屬性添加到根元素。 「當我添加x:Class屬性時,我得到這樣的錯誤:「缺少對'TestApp.Pages.BasePageManageItems'類型聲明的部分修飾符;這種類型的另一個部分聲明存在」 – 2009-11-26 16:58:41

+1

這是正確的你有'MouseDown'事件不能在編譯時綁定,因爲字典沒有代碼。 您應該在運行時添加事件處理程序或使用命令:http://msdn.microsoft.com/en-us/library/ms752308.aspx。 – Mart 2009-11-27 09:42:01

相關問題