2011-02-12 66 views
15

在我的基於WPF4桌面的應用程序中,有一個帶有側欄菜單的大塊,在每個窗口中重複並佔用大約70行XAML。爲了提高代碼重用,我想分裂XAML文件在兩個文件:在Sub-XAML文件的數量上拆分一個大的XAML

  1. XAML的文件,其中包含的代碼,其中包含工具條菜單(≈70線)
  2. 基地XAML文件«包括/參考»到XAML文件與工具欄菜單代碼

我的理解,存在實現我的問題有兩種方法:

  1. 使用ResourceDictionary中
  2. 使用用戶控件/CustomControl

我的問題是:

  1. 是什麼資源字典用戶控件之間的區別?你可以給我舉例,我必須使用UserControlResourceDictionary

  2. 您能給出一個完整的代碼示例如何包含/將一個XAML文件的內容導入到其他?

P.S.下面是我要導出到單獨的XAML文件的代碼示例:

<Border Style="{StaticResource Body_SideBarMenu_Border_Settings}"> 
    <StackPanel Style="{StaticResource Body_SideBarMenu}"> 

    <TextBlock Style="{StaticResource Body_SideBarMenu_Title}" 
      Text="{x:Static res:Resources.WinApp_SideBarMenu_Title}" /> 

     <TextBlock x:Name="SideBar_WinReports" 
       Style="{StaticResource Body_SideBarMenu_Item}" 
       Text="{x:Static res:Resources.DashListMarker}"> 
        <Hyperlink KeyboardNavigation.TabIndex="12" 
          Style="{StaticResource Body_SideBarMenu_Item_Hyperlink}" 
          Click="Call_WinReports_Click"> 
          <TextBlock Text="{x:Static res:Resources.WinApp_ModuleName_Reports}" /> 
        </Hyperlink> 
     </TextBlock> 

    </StackPanel> 
</Border> 

回答

13

ResourceDictionary的只是你的風格/模板等的容器所以,你真的有使用樣式(和引用它之間的選擇通過ResourceDictionary)或UserControl。

爲了區分兩者,問問自己一個問題:你是否正在實現一個現有控件的另一個外觀,或者你正在實現一些真正新的東西,它不僅僅是一個ListView(或邊框,或者組合框等)?在前一種情況下,使用一種風格;在後者中,創建一個新的UserControl。

特別爲你的情況,我會去一個UserControl。


代碼示例(雖然不是全部)

(請注意,可以用VS的插入以下的代碼模板 「添加新的用戶控件」)

的XAML:

<UserControl x:Class="SomeNamespace.SidebarMenu" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <UserControl.Resources> <!-- you can define local styles here --> 
     <Style x:Key="SidebarMenuTextblock" TargetType=TextBlock> 
      ... 
     </Style> 
    </UserControl.Resources> 

    <Border Background=...> 
     <StackPanel> 

      <TextBlock 
       x:Name="Put_a_name_if_you_want_to_reference_this_item_in_code_behind" 
       Style="{StaticResource SidebarMenuTextblock}" 
       Text="{x:Static res:Resources.WinApp_SideBarMenu_Title}" /> 
      ...  </StackPanel> 
    </Border> 
</UserControl> 

。CS:

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

namespace SomeNamespace 
{ 
    public partial class SidebarMenu : UserControl 
    { 
     public NumericUpDown() 
     { 
      InitializeComponent(); 
     } 
     ... 
     // define here your properties etc, 
    } 
} 

現在,你可以使用這樣的控制:

<Window 
    x:Class="SomeOtherNamespace.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:controls="clr-namespace:SomeNamespace"> 

    <Grid> 
     <controls:SidebarMenu PropertyIfYouDefinedOne="SomeValue"/> 
     ... 
    </Grid> 

</Window> 
1

如果你可以得到Expression Studio的你的手,在Expression Blend中,你可以簡單地右鍵點擊任何控制和轉換它給用戶控制。這很簡單。

用戶控件適用於拆分XAML文件。實質上,它用於重新定義現有控件的行爲。

但是,通過用戶控件,您可以定義完整的WPF佈局控件並將它們轉換爲一個用戶控件,其中包含子內容。這對跨多個開發人員的項目非常有用,也可以用來模擬MDI的行爲,這在WPF中是不存在的。

+1

而且,這不僅僅是考慮可重用的控制。你可以這樣做來控制不可重用的控件。 – r3st0r3 2011-02-18 14:25:26